指向一维数组的指针与指向一维数组中的元素的指针的区别

指向一维数组的指针与指向一维数组中某个元素的指针的区别😫

先看几段代码吧:
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]; // 定义一个指向一维数组的指针

总结: 要区分指向一维数组的指针与指向一维数组中某个元素的指针其实很简单, 重点看如何对指针进行初始化。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值