C语言 数组指针与指针数组的探讨一
来源:互联网 发布:最优化计算方法 编辑:程序博客网 时间:2024/04/29 14:25
为了理解属语言的指针数组与数组指针,特写了如下代码。然后在执行的过程中又引出个问题,看来一些多动手,才会发现原本自己觉得懂的东西原来不是那么的扎实。
且看如下代码:
正确代码:
#include <stdio.h>
int main (int argc,char * argv[])
{
int * ParrayVal[2];/*ParrayVal[2] have three elements,each one is a (int *) pointer.*/
int (*arrayPVal)[2]; /* arrayPVal is one pointer,pointer to a array have two int element.*/
int a=1,b=2,c=3;
ParrayVal[0]=&a;
ParrayVal[1]=&b;
ParrayVal[2]=&c;
printf("&a=%p\n",&a);
printf("&b=%p\n",&b);
printf("&c=%p\n",&c);
printf("ParrayVal[0]=%p\n",ParrayVal[0]);
printf("ParrayVal[1]=%p\n",ParrayVal[1]);
printf("ParrayVal[2]=%p\n",ParrayVal[2]);
int array[2]={3,4};
arrayPVal=&array;
printf("array=%p\n",array);
printf("array=%p\n",&array);
int i=0;
for (i;i<=1;i++)
{
printf("array[i]=%d\n",(*arrayPVal)[i]);
}
return 0;
}
错误代码:
#include <stdio.h>
int main (int argc,char * argv[])
{
int * ParrayVal[2];/*ParrayVal[2] have three elements,each one is a (int *) pointer.*/
int (*arrayPVal)[2]; /* arrayPVal is one pointer,pointer to a array have two int element.*/
int a=1,b=2,c=3;
ParrayVal[0]=&a;
ParrayVal[1]=&b;
ParrayVal[2]=&c;
printf("&a=%p\n",&a);
printf("&b=%p\n",&b);
printf("&c=%p\n",&c);
printf("ParrayVal[0]=%p\n",ParrayVal[0]);
printf("ParrayVal[1]=%p\n",ParrayVal[1]);
printf("ParrayVal[2]=%p\n",ParrayVal[2]);
int array[2]={3,4};
arrayPVal=array;
printf("array=%p\n",array);
printf("array=%p\n",&array);
int i=0;
for (i;i<=1;i++)
{
printf("array[i]=%d\n",(*arrayPVal)[i]);
}
return 0;
}
红色部分是这两段代码的唯一区别,如果上进去调试,这两段代码的执行结果都不会出问题。但是第二个代码会有告警。为了搞明白这个原因。同时参考了下网上各位达人的帖子总结如下。
为什么arrayPVal=array 和 arrayPVal=&array 结果是相同的,但是到底有什么差别呢?
1.他们的值确实相同,即指向的内存地址都是相同的。
2.他们的类型不同,array 通常表示数组元素的首地址,结合上述代码的描述,其退化成一个int *的指针类型。而&array表示的是一个数组指针,指向的一个int [2]的数组。
所以两者在类型上是不同的。
一个可以等价于 :int * a;
一个是: int (*a) [2];
-------------------以下具体也不是太清楚,请大家继续评论-----------------------------------
再说说(*arrayPVal)[i].首先 arrayPVal 是一个数组指针。
arrayPVal=&array赋值后,我们暂且记住对数组首地&后,相当于做了一个强制类型转换,把一个int *指针转化为 int (*)[ ] 指针。
他的值等于array数组第一个元素的地址的地址。*arrayPVal在值上等于 &array[0]; 不知到下面的为什么要写成这样?
printf("array[0]=%d\n",**arrayPVal);
printf("array[1]=%d\n",*(*arrayPVal+1));
- C语言 数组指针与指针数组的探讨一
- C语言 数组指针与指针数组的探讨一
- C语言:指针数组与数组指针
- C语言指针数组与数组指针
- C语言指针数组与数组指针
- C语言 数组与指针(一)
- 【指针篇】C语言:指针与数组的区别,数组指针与指针数组的剖析。
- C语言 指针与一维数组,指针遍历一维数组的多种方法
- C语言 指针与一维数组,指针遍历一维数组的多种方法
- C语言的指针数组与数组指针关系
- C语言的指针数组与数组指针关系
- C语言中的指针数组与数组指针的理解
- c语言的指针数组与数组指针
- 指针与数组探讨
- c语言指针初探 一 指针与数组
- C 语言中的元素指针与一维数组指针
- 关于C语言指针和数组的深入探讨
- C语言 数组与指针的理解
- Linux系统--job control
- hacking remote systems using Armitage
- fatal error RC1004: unexpected end of file found处理方法
- 谈谈android反编译和防止反编译的方法
- other person's blog
- C语言 数组指针与指针数组的探讨一
- Jquery对多选框的特殊操作
- 30岁前成功的12条黄金法则
- mysql直接执行和预处理执行的效率比较
- 比较不错的SEO学习的网站
- 《那些年啊,那些事——一个程序员的奋斗史》——67
- Servlet 3.0 新特性详解
- 阅读、仔细阅读、反复阅读每个开源框架自带的reference
- 远程连接sql server 2000服务器的解决方案