指向数组的指针,先初始化一个数组,使用传统方式遍历
1 void main() 2 { 3 int a[5] = { 1,2,3,4,5 }; 4 for (int i = 0; i < 5; i++) 5 { 6 printf("%d,%x ", a[i], &a[i]); 7 printf("%d,%x ",*(a+i),a+i); //等价 a[i] , &a[i] 8 } 9 }
a就是数组a的首地址,即元素1的地址, a + 1 代表 地址+1,即这里就是增加 int型 4字节的长度, 指向下一个地址即元素2的地址
1 int a[5] = { 1,2,3,4,5 }; 2 int *p = NULL; //创建一个空指针 3 p = a;//p是一个指针变量,a就是 数组首地址 元素1的地址
因为我们利用指针遍历同样能达到效果
1 //利用指针循环 2 for (int *pp = a; pp<a+5; pp++) //地址++ 3 { 4 printf("%d,%x ",*pp, pp); 5 }
有了上面的理解,指针结构体其实是一样的。
1 //指针结构体 2 struct info 3 { 4 char name[50]; 5 int id; 6 }; 7 8 void main() 9 { 10 struct info myinfo[5] = { {"zc1",1},{ "zc2",2 }, {"zc3",3}, {"zc3",3}, {"zc4",4} }; 11 12 //常规方式输出 13 for (int i = 0; i < 5; i++) 14 { 15 printf("%s,%d ",myinfo[i].name, myinfo[i].id); 16 //指针 17 printf("%s,%d ", (*(myinfo+i)).name, (*(myinfo + i)).id); 18 } 19 20 //利用指针循环,指针结构体 21 struct info *px = myinfo; 22 for (; px < myinfo; px++) 23 { 24 printf("%s,%d ", px->name, px->id); //指针结构体输出方式 指针变量->属性 25 printf("%s,%d ", (*px).name, (*px).id); //指针结构体输出方式 *指针变量.属性 26 // px->id等价 (*px).id 27 } 28 29 getchar(); 30 31 }