1、在C语言中使用指针可以使得:
2、基本知识:
在计算机中,每一个字节单位,都会有一个编号,这个编号称之为地址。---- 内存以 字节为单位 分配内存。
1Byte(字节) = 8 Bit(位)
在不影响理解的情况下,一般把地址、指针变量、指针不区分 通称为指针。
#include
int main(void)
{
int* p;
int a = 1 ;
p = &a;
printf("%d \r\n",*p);
*p = 23;
printf("%p ",p);
printf("%d \r\n",*p);
return 0;
}
以上程序打印出来的结果 :1 0xbffebdf8 23
例子 : int* p =NULL; p 只存放指针, *p 指向存放在 p 地址中的 的地址位置 -------- p也是一个变量,有自己的地址。
如果他指向的区域是程序中的一个变量的内存空间,则这个变量称为 指针的目标变量,简称为指针的目标。
1、把一个普通变量 的地址 赋给 相同数据类型的指针变量 ---- double a = 0, *p; p = &a;
1、把一个已知地址值的指针变量赋给另一个具有相同数据类型的指针变量 ---- double a[20], *p; p = a;
例如 :int* p ; p = p+2; ------------ p指针向大地址方向递增了两个 int 数据(8个字节) 的位置。
int* p1 ; p1 - p : 相减的结果是两个指针之间相差的(int)数据个数。
指针之间的关系运算一般说的是地址之间的运算,与整数运算没有任何意义,-------- 指针可以跟零进行等于与不等比较,来评断指针是否为空。
例子 :int a [2] = {2,3} ; int* p ; p = &a[1] y = (*--p) -------------- y = 2; (++ 的优先级比 * 高)
题目 :使用指针的方式,将一个数组中的各个元素实现 逆序输出。
#include
int main(int argc, const char *argv[])
{
int a[5] = {1,2,3,4,5};
int *q,*p;
int t,i,n;
n = sizeof(a)/sizeof(int);
q = a ;
p = &a[n-1];
while(q
题目:使用一级指针遍历二维数组。
#include
int main(int argc, const char *argv[])
{
int a[5][2] = {{1,6},{2,1},{3,3},{4,2},{5,1}};
int *q,*p;
int t,i,n;
n = sizeof(a)/sizeof(int);
q = &a[0][0] ;
for(i=0 ;i
题中 : q 与 a 是不同类型 ------- q 每加1地址加4 ,而a每加1 地址加8。
对于二维数组:带数组名的 不一定 一定是常量,也可能是 指针变量。
使用行指针 遍历一个 二维数组:
#include
int main(int argc, const char *argv[])
{
int a[5][2] = {{2,1},{1,0},{3,6},{4,4},{5,1}};
int (*p)[2];
int i,j;
p = a;
for(i=0;i<5;i++)
for(j=0;j<2;j++)printf("%d %d \r\n",p[i][j],*(*(a+i)+j));
return 0;
}
题中 : p[i][j] 与 *(*(a+i)+j)等价。