8.9指针重点

来源:互联网 发布:淘宝详情关联怎么做 编辑:程序博客网 时间:2024/05/26 02:21

今天学习了很绕很绕的指针。

早上学的是指向指针的指针,指针变量也是变量,占据一定的内存空间,有地址,因此可以用一个指针指向他。可以用**P表示,一个*表示一个地址,*P = 变量的地址,**P = 变量的地址上的数值的地址,**P是自己也有内存。指针类型和指向指针的数据或指针类型一致。

int a=10;

int *p=&a;   给指针p赋值a的地址

printf("%d,%d",a,*p); 结果输出10 ,10;

int **p1 = &p;

printf("%d",**p1);     结果输出10;


下午学习的是指针的运算:

p = &a ;      (将变量a地址赋给p)

p = a;            (将数组a首地址赋给p)

p = &a[1];        (将数组元素地址赋予p)

一个类型为T的指针的移动以sizeof(T)为移动单位


int a[3]={1,4,2};

int *p;                            分两步写

p=&a[0]或者写成p=a;

for(int i = 0;i<sizeof(a)/sizeof(int);i++){

printf("%d",a[i]);       输出1,4,2    这一行和下一行是等价的

printf("%d",*(p+i))     输出1,4,2   一个类型为T的指针的移动以sizeof(T)为移动单位,比较两个指针的大小实际上是比较两个地址的前后,在后面的大,所以 p的地址每加i,*(p+i)就是取*p后面的那个地址的值,就可以做到依次取出数组里面的值。


printf("%d",*p++);     输出1,4,2   先执行++,这里是优先级的问题,所以下面的情况是错误的

printf("%d",(*p)++);  输出1,2,3

}


指针与数组:指向数组元素的指针变量 a[i]<==>p[i]<==>*(p+i)<==>*(a+i)

通过指针引用多维数组,a[i]+j代表a[i][j]的地址,a[i]表示某一行的首地址,j是第几列

*(a[i]+j)=a[i][j]

*(*(a+i)+j)等价于*(a[i]+j)

int a[3][3]={{11,5,7},{8,4,6},{1,2,3}};

int *p;

p=&a[0][0];或者可以写为p=&a,意思都是取a数组的首地址

1。for(int i = 0;i<9;i++){因为数组元素是9个,下表从0开始,所以i<9

printf("%d\n",*p++);

printf("%d\n",*(p+i));和上面说的一样

}

2.for(int i = 0;i<3;i++){

for(int j = 0;j<3;j++)

printf("%d\n",*(a[i]+j));这两种输出是等价的,不同的地方是a[i]和*(a+i),a[i]的值是一个地址,表示第i行的首地址,*(a+i)取得的值也是一个地址,表示a的地址移动i个单位以后的地址

printf("%d\n",*(*(a+i)+j))

}








0 0