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

在C中打印数组元素地址时出错,c,C,我收到一条错误消息: 无法增加int[2]类型的值 这是因为int的大小还是什么 int arr[2]={10,20}; printf("%p \t %p \t",arr,++arr); 请注意,您正在尝试修改数组的地址 考虑: printf("%p \t %p \t",arr,++arr); 我想您应该在第二个位置(索引1)打印数组元素的地址 要打印地址(如果arr[1]),您可以尝试: &a[1] (a+1) 使用指针 使用动态分配的数组 #define ARRAY_COUNT 10

我收到一条错误消息:

无法增加int[2]类型的值

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

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

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

考虑:

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
没有严格规定将参数传递给函数的顺序(从左到右或其他)

在这里:

  • 情况1:从左到右的参数传递导致首先打印
    arr
    地址(a[0]的地址),然后递增以打印下一个地址(a[1]的地址)

    输出:

    0x7fffdf064110   0x7fffdf064114
    0x7fffdf064110   0x7fffdf064114
    0x7fffdf064110   0x7fffdf064114
    
    0x7fffdf064114   0x7fffdf064114
    0x7fffdf064114   0x7fffdf064114
    0x7fffdf064114   0x7fffdf064114
    
  • 情况2:从右向左参数传递导致
    arr
    地址首先递增并打印(a[1]的地址),然后打印地址(a[1]的地址)

    输出:

    0x7fffdf064110   0x7fffdf064114
    0x7fffdf064110   0x7fffdf064114
    0x7fffdf064110   0x7fffdf064114
    
    0x7fffdf064114   0x7fffdf064114
    0x7fffdf064114   0x7fffdf064114
    0x7fffdf064114   0x7fffdf064114
    

您无法修改其值的唯一原因是,一旦您使用
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

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;
}

我希望我说清楚了。欢迎任何疑问。

您不能增加每一个元素,因为
++
操作符使用
int
而不是
int[2]
。它的原因是您不能递增arraysso是获取arr[1]地址的唯一方法是:printf(“%p”,arr[1]);或者有另一种方式访问地址!使用
printf(“%p\t%p\t”、(void*)arr、(void*)和arr[1])这是未定义的行为。读一本关于基础知识的书。