指向一维数组的指针与指向一维数组中某个元素的指针的区别😫
先看几段代码吧:
1.
#include <stdio.h>
int main()
{
int a[4]={1,3,5,7};
int (* p)[4];
p=&a;
printf("a[3]=%d\n",(*p)[3]);
printf("指针p的值=%d\n", p);
printf("指针p+1的值=%d\n", p+1);
printf("&a的值=%d\n", &a);
printf("&a+1的值=%d\n", &a+1);
return 0;
}
运行结果:
a[3]=7
指针p的值=1703728
指针p+1的值=1703744
&a的值=1703728
&a+1的值=1703744
Press any key to continue
分析:int (* p)[4]; p=&a(而不是p=a); 则*p =a ,表示指针p指向含有4个元素的一维数组a,而不是指向数组a的元素, 故p+1=&a+1。又因为数组a为int型,每个元素占4B,每行4个元素,故a+1与a的值应该相差16,所以若p是指向一维数组a,那么p+1与p应该也相差16,运行结果确实如此,可见p确实是指向一维数组a的指针。
2.
#include <stdio.h>
int main()
{
int a[4]={1,3,5,7};
int (* p)[4];
p=a;
printf("a[3]=%d\n",(*p)[3]);
printf("指针p的值=%d\n", p);
printf("指针p+1的值=%d\n", p+1);
return 0;
}
运行结果:
在VC++6.0中:
--------------------Configuration: project1 - Win32 Debug--------------------
Compiling...
project1.c
E:\C-programming-review\project1.c(6) : warning C4047: '=' : 'int (*)[4]' differs in levels of indirection from 'int *'
Linking...
project1.exe - 0 error(s), 0 warning(s)
a[3]=7
指针p的值=1703728
指针p+1的值=1703744
Press any key to continue
在Visual Studio Code中:
[Running] cd "e:\C-programming-review\" && gcc project1.c -o project1 && "e:\C-programming-review\"project1
project1.c: In function 'main':
project1.c:6:3: warning: assignment to 'int (*)[4]' from incompatible pointer type 'int *' [-Wincompatible-pointer-types]
p=a;
^
a[3]=7
指针p的值=6422064
指针p+1的值=6422080
[Done] exited with code=0 in 0.256 seconds
分析:代码2与代码1的唯一区别就是代码2中是令p=a,并且代码2虽然运行结果与代码1相同,但是无论在VC++6.0还是在VS Code中,编译结果都会有个warning,提示我们在代码中错误地将int * 型指针的值赋给int (* )[4]型指针,这是因为编译系统在编译时会将一维数组名a当作指针来处理。虽然结果是对的,但是实际编程时最好不要这样写,因为p=a=&a[0],则*p=a[0],表示指针p是指向数组元素,而不是指向数组的一行。
#include <stdio.h>
int main()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int (* p)[4];
p=a;
printf("a[1][1]=%d\n",*(*(p+1)+1));
printf("p的值=%d\n",p);
printf("p+1的值=%d\n",p+1);
return 0;
}
a[1][1]=11
p的值=1703696
p+1的值=1703712
Press any key to continue
分析: 同理,对于二维数组a, 令p=a,则*p=*a=a[0],显然,a[0]是一维数组名,显然,与上面的代码1.中的一维数组道理相同,这里也表示p是指向一维数组的指针。
另外,注意以下两条语句的区别。
int *p[4]; //定义一个指针数组
int (*)p[4]; // 定义一个指向一维数组的指针