c语言二维数组的问题,二维数组指针问题

xxdd 发布于 2013/02/28 11:30
阅读 346
收藏 0

int num[5]={1,2,3,4,5};

cout <<*((int *)(&num))<<endl;

cout <<*((int *)(&num+1))<<endl;

cout <<*((int *)(&num+1)-1)<<endl;

//分别输出什么?为什么?谢谢。

加载中
0
剑尖血凝紫
剑尖血凝紫

cout <<*((int *)(&num))<<endl;

0

cout <<*((int *)(&num+1))<<endl;

越界访问栈内存,结果未知

cout <<*((int *)(&num+1)-1)<<endl;

5

0
xxdd
xxdd

引用来自“眠月”的答案

cout <<*((int *)(&num))<<endl;

0

cout <<*((int *)(&num+1))<<endl;

越界访问栈内存,结果未知

cout <<*((int *)(&num+1)-1)<<endl;

5

为什么?分析一下。
0
剑尖血凝紫
剑尖血凝紫

引用来自“hanxiaodong”的答案

引用来自“眠月”的答案

cout <<*((int *)(&num))<<endl;

0

cout <<*((int *)(&num+1))<<endl;

越界访问栈内存,结果未知

cout <<*((int *)(&num+1)-1)<<endl;

5

为什么?分析一下。

第一个错了,应该是num[0]的地址

第二个是*(num[0]+20)

第三个是*(num[0]+20-4)=5

0
Michael_Yuan
Michael_Yuan

楼主把我的代码跑一下就明白了。


#include <stdio.h>
int main()
{
    int num[5]={1,2,3,4,5};
    int i;
    //这里是故意把num[5]以及num[5]的地址打印出来,属于越界访问
    for (i = 0; i < (sizeof(num)/sizeof(int)) + 1; i++) {
        printf("variable num[%d]\'s addr is [%p], and addr [%p]\'s value is [%d]\n", i, &num[i], &num[i], num[i]);
    }
    printf("1. [%p] %d\n", (int *)(&num), *((int *)(&num)));
    printf("2. [%p] %d\n", (int *)(&num+1), *((int *)(&num+1)));
    printf("3. [%p] %d\n", ((int *)(&num+1)-1), *((int *)(&num+1)-1));
    
    return 0;
}
打印如下:



$ ./a.exe
variable num[0]'s addr is [0x22ac38], and addr [0x22ac38]'s value is [1]
variable num[1]'s addr is [0x22ac3c], and addr [0x22ac3c]'s value is [2]
variable num[2]'s addr is [0x22ac40], and addr [0x22ac40]'s value is [3]
variable num[3]'s addr is [0x22ac44], and addr [0x22ac44]'s value is [4]
variable num[4]'s addr is [0x22ac48], and addr [0x22ac48]'s value is [5]
variable num[5]'s addr is [0x22ac4c], and addr [0x22ac4c]'s value is [5]
1. [0x22ac38] 1
2. [0x22ac4c] 6
3. [0x22ac48] 5

原因:

1.第一个不用解释吧。

2.第二个,num+1的意义其实是 num[0]的地址值+ sizeof(num)(这里是20个字节),所以结果是0x22ac38 + 0x000014 = 0x22ac4c,也就是num[5]的位置。属于越界访问,这里num[5]的值是不确定的。

3.第三个,num+1上面解释了,注意第三个把(num+1)强转成了(int *)的类型。
但是num和num+1之前是(int[5])类型,加1的实际意义是后移20字节。转成(int *)后(注意,这里强转换操作优先级高于减法),再减1的实际意义是前移4字节,也就是0x22ac4c - 0x000004 = 0x22ac48,也就是num[4]的值,不属于越界访问。

总结:

1. 指针变量做加减运算的时候,先要明确该指针当前是什么类型的,然后才知道加、减的“1”具体是多少个字节。

2.强转换不影响指针变量本身,因为定义的时候就永远定下来了。

0
魔力猫
魔力猫
别用c++说c呀。
0
x
xiaoyang80

对于代码:

int num[5]={1,2,3,4,5};
	cout<<num<<endl;
	cout<<*num<<endl;
	cout<<*(&num)<<endl;
	cout<<&(*num)<<endl;
	cout<<&num<<endl<<endl;

输出结果是:

0012FF6C
1
0012FF6C
0012FF6C
0012FF6C

如何理解后三个输出结果呢?

返回顶部
顶部