• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

c语言数组及指针问题

2356174012 2017-09-12 浏览量:929

源码:

#include <stdio.h>


int main(void)
{
const int a =2;
int b[a] ={1};
int d =8;
int c =7;
int *p=b; 

printf("地址0_1 =%d\n", &c); //系统分配地址为  6553224 

printf("地址0_2 =%d\n", &d); //系统分配地址为  6553228 

printf("地址1_1 =%d\n", b-1);  //系统分配地址为  6553232 

printf("地址1_2 =%d\n", &b); 

printf("地址1_3 =%d\n", &b[0]);

printf("地址2_1 =%d\n", b+1);

printf("地址2_2 =%d\n", (&b-1));  
  printf("取地址2_2的值 =%d\n", *(&b-1));  //==>这里有问题 : 输出是6553224
printf("地址2_3 =%d\n", &b[0]+1);

printf("地址5   =%d\n", p);

printf("地址6   =%d\n", p+1);

 

 } 

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  •                         你需要这样写:
                            printf("取地址2_2的值 =%d\n", **(&b-1));
                            或者这样写:
                            printf("取地址2_2的值 =%d\n", *(b-1));
                            
                            你出错的原因就是:b的值本来就是个地址值,
                            如果你还取地址的话,和前面的*就抵消了 *(&b -1) == (b-1)
                            所以你输出的是地址值

    • 发布于 2017-09-12
    • 举报
    • 评论 9
    • 2
    • 0
2356174012 回复了 Sourcelink:它没有运算的优先级吗?他不应该是先运算了(&b-1)算出地址,再去取地址中的值吗?? 回复
Sourcelink 回复了 2356174012:b本来就是个地址值,如果你还取地址的话,就是数组存放的地址,然后在这基础上减1,再取指针后还是一个地址啊。*&这两个符号有相互抵消性,你重复取地址了,取出来的地址虽然是相同,但是运算是不一样的。 回复
Sourcelink 回复了 2356174012:(b-1)和(&b-1)的结果是不同的吧,(b+1)和(&b+1)的结果也是不同的吧 这两种运算的意义是不同的 回复
Sourcelink 回复了 2356174012:(b+1)是数组指针偏移1,而(&b+1)地址偏移量是这个数组的大小。因为你这个去值符表示取这整个数组的地址。就好比江西省的省会是南昌市,省会和南昌市的地址是一样的,但是江西省的地址空间更大,在江西省的地址空间上加1和在南昌市的地址上加1还是有很大区别的,希望你能理解。,。 回复
lygo 回复了 Sourcelink:老哥正解!!!居然我也懂了,厉害 回复
lygo 回复了 Sourcelink:老哥正解!!!居然我也懂了,厉害 回复
lygo 回复了 Sourcelink:老哥正解!!!居然我也懂了,厉害 回复
Sourcelink 回复了 lygo:哈哈,你要vc6试下比较好 回复
2356174012 回复了 Sourcelink:好的,谢谢解答。 回复

其他答案 数量:4
  • 我是看您的Code怪怪的

    宣告已經是陣列了b[a]

    所以這問題會變成b是一個陣列型態的連續地址

    而&b會是取到第一個位址,跟b效果相同

    但如果去做運算時候

    &b+1會是以整個陣列大小去做偏移...所以會+8

    而b+1則是以元素大小(這裡是int)去做偏移...所以會+4

    您要很清楚這個觀念

    而這個*(&b+1)運算

    編譯器會視為&b+1,即和&抵銷,所以你要取值是要**(&b+1),會取到不相關的數值

    以上




    • 发布于2017-09-13
    • 举报
    • 评论 0
    • 1
    • 0

  • 楼主,printf("取地址2_2的值 =%d\n", *(&b-1));  &b是数组地址的指针。
    • 发布于2017-09-12
    • 举报
    • 评论 0
    • 0
    • 0

  • 改成printf("取地址2_2的值 =%d\n", *(b-1));试试看
    • 发布于2017-09-12
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

c语言数组及指针问题