在C中打印数组元素的地址时出错

时间:2015-08-18 23:12:00

标签: c

我有一条错误消息:

  

不能增加int [2]

类型的值

这是因为int的大小还是什么?

int arr[2]={10,20};
printf("%p \t %p \t",arr,++arr);

2 个答案:

答案 0 :(得分:1)

能够修改其值的唯一原因是,您定义静态 array,其大小为n,然后变量名称 被视为常量指针(其值不能更改)

  

这个限制是由编译器强加的,因为它认为如果你改变值arr那么就没有办法确保程序的准确性,因为基地址已被修改

但如果您真的想玩指针,请检查以下代码:

int main() {
    int arr[] = {1,2,3,0};
    int *ptr = arr;

    while(*ptr != 0) {
        printf("%i ",*ptr);
        ptr++;                   // or     ++ptr;
    }
    return 0;
}

输出: 1 2 3

int main() {
    int *arr = (int*)malloc(4*sizeof(int));
    arr[0] = 1;   
    arr[1] = 2; 
    arr[2] = 3; 
    arr[3] = 0;

    while(*arr != 0) {
        printf("%i ",*arr);
        arr++;                  
    }
    return 0;
}

输出: 1 2 3

我希望我清楚自己。任何疑问都是最受欢迎的。

答案 1 :(得分:0)

请注意,您正在尝试修改数组的地址。

考虑:

printf("%p \t %p \t",arr,++arr);

我想你想在第二个位置(索引1)打印数组元素的地址。

如果arr[1]可以尝试打印地址:

  • &安培; A [1]
  • (A + 1)
  • 使用指针
  • 使用动态分配的数组

    #define ARRAY_COUNT 10
    int main() {
        int *arr = (int*)malloc(ARRAY_COUNT*sizeof(int));
    
        while(*arr != 0) {
            printf("%p ",arr);
            arr++;                  
        }
        return 0;
    }
    

最终代码:

#include <stdio.h>

int main()
{
    int arr[2]={10,20};
    int *ptr=arr;
    printf("%p \t %p \t\n",ptr,ptr+1);
    printf("%p \t %p \t\n",arr,arr+1);
    printf("%p \t %p \t\n",arr,&arr[1]);
    return 0;
}

示例输出:

sh-4.3$ gcc -o main *.c
sh-4.3$ main
0x7fffdf064110   0x7fffdf064114
0x7fffdf064110   0x7fffdf064114
0x7fffdf064110   0x7fffdf064114

<小时/> 另请注意声明:

printf("%p \t %p \t",arr,++arr);

未指定特定于实施的行为,因为它可以(并且确实)在不同的计算机上生成不同的结果。简而言之,C并未严格指定将参数传递给函数的顺序(从左到右或以其他方式)。

下面:

printf("%p \t %p \t",arr,++arr);
  • 案例1:从左到右参数传递导致arr地址([0]的地址)首先打印然后递增以打印下一个地址(地址) [1])

    输出:

    0x7fffdf064110   0x7fffdf064114
    0x7fffdf064110   0x7fffdf064114
    0x7fffdf064110   0x7fffdf064114
    
  • 案例2:从右到左参数传递导致arr地址首先递增并打印([1]的地址)然后打印地址(地址)一个[1])

    输出:

    0x7fffdf064114   0x7fffdf064114
    0x7fffdf064114   0x7fffdf064114
    0x7fffdf064114   0x7fffdf064114