首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言-指针有关问题

2013-09-06 
C语言-指针问题今天在翻阅于正冲老师的《C语言深度剖析》(希望我没写错字。)的时候遇到了一个问题很不解。想提

C语言-指针问题
今天在翻阅于正冲老师的《C语言深度剖析》(希望我没写错字。)的时候遇到了一个问题很不解。想提出来,请精通C语言的大神帮助理解一下。谢谢。我是用WIN7 64位系统VC6.0编译如下截图程序查看内存结果如下截图。C语言-指针有关问题

请问一下:
1-对于图中画红色线的地方怎么会是这种结果呢?
2-p1 和 (int *)(&a+1)的值不一样?p1直接指向了a数组的末端下一个int类型数,而后者指向了a[0]的第一字节。求解释额。。谢谢。。。 C 指针 地址
[解决办法]


#include<stdio.h>

int main()
{
int a[5]={1,2,3,4,5};

int *p1;
int *p2;
int *p3;

p1= a;//数组名可以做数组的首地址
p2 = a+1;//指向第‘1’个元素
p3 = (int *)(a+1);//指向第‘1’个元素

printf("%x, %x, %x, %d, %d\n", p1, p2, p3, sizeof(a), sizeof(a[0]));

p1= (int *)(&a +1);//数组首地址,再取地址,相当于指针的指针,相当于二维数据,+1,相当于加上sizeof(a)
//这一句相当于:
p1 = (int *)((int)a + sizeof(a));
//或者相当于
p1 = a + sizeof(a)/sizeof(a[0]);

p2 = (int *)((int)a+1);//把地址强制转换成整型数然后加1,把结果当做地址。。。。
p3 = (int *)(a+1);//第‘1’个元素

printf("%x, %x\n", p1[-1], *p2);
return 0;
}

[解决办法]
p1指向的地址应该是数组a的末尾,即(a+5)的地址。这个你可以通过打印p1的地址,然后计算一下a的地址加上5 * 4的结果是一样的。p1和a相差20个字节的距离。
[解决办法]
引用:


p1= (int *)(&a +1);//数组首地址,再取地址,相当于指针的指针,相当于二维数据,+1,相当于加上sizeof(a)


说错了 
不是指针的指针
是数组的指针
搞清楚 数组名不是指针
搞清楚 数组的一种数据类型
搞清楚 指针+1的含义 

[解决办法]
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

[解决办法]
VC调试时按Alt+8、Alt+7、Alt+6

和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

[解决办法]
单个数组名表示数组的首地址,&a是数组的地址,a是数组的首地址,&a+1相当于你就是走过一个数组的长度,a+1就是向后移动一位。犹如北京市是首都也是市政府
[解决办法]


但你的截图里面没有打开内存窗口。

热点排行