This question already has answers here:
Closed 5 years ago.
Are a, &a, *a, a[0], &a[0] and &a[0][0] identical pointers?
(8个答案)
我得到以下代码的输出为->
我被输出搞糊涂了,所以我修改了一小部分代码并检查了它。
我用这个
我听说,
衰减特别允许数组隐式地转换为指向其第一个元素的指针。
但是,以下代码无效,因为衰减与获取数组地址不同:
第一个示例为您提供指向整数(数组中的第一个整数)的指针。在第二个示例中,
外星人应该告诉你这根本不是你所期望的。
确实,
指针操作的结果至少取决于指针的类型和指针的值。每次将
它之所以编译是因为您将指针强制转换为int指针,如果您需要我的建议,就不应该用强制转换消除编译器对指针的警告。
(8个答案)
我得到以下代码的输出为->
6
我被输出搞糊涂了,所以我修改了一小部分代码并检查了它。
我用这个
int * ptr=(int*)(a+1)
替换了Not clear语句,得到的输出是-->1
。怎么用?我听说,
&a
,a
,a[0]
都是同一个地址?是什么让它与众不同?#include<stdio.h>
int main()
{
int a[] = {1, 2, 3, 4, 5, 6};
int *ptr = (int*)(&a+1); //NOT CLEAR
printf("%d ", *(ptr-1) );
getchar();
return 0;
}
最佳答案
像许多其他开发人员一样,您会被衰退搞糊涂。以下代码有效,因为a
将隐式衰减为指针:
int a[] = {1,2,3};
int* b = a;
衰减特别允许数组隐式地转换为指向其第一个元素的指针。
但是,以下代码无效,因为衰减与获取数组地址不同:
int a[] = {1,2,3};
int* b = &a; // INVALID
第一个示例为您提供指向整数(数组中的第一个整数)的指针。在第二个示例中,
&a
为您获取指向3个整数数组的指针。如果必须将其分配给变量,则其类型为:int a[] = {1,2,3};
int (*b)[3] = &a;
外星人应该告诉你这根本不是你所期望的。
确实,
a
(一旦衰减)、&a
和&a[0]
都应该指向同一个地址。然而,它们并不指向同一类事物(&a
指向数组,而其他的指向整数)。指针操作的结果至少取决于指针的类型和指针的值。每次将
&a
指针增加1,内存中将移动三个整数,而不仅仅是一个,因为类型的大小是(整数的3倍大小)。这就是当你做(&a + 1)
时会发生的事情,这就是为什么你会得到一个意想不到的结果。在这个内存地址没有定义值,所以您得到了未定义的行为。它之所以编译是因为您将指针强制转换为int指针,如果您需要我的建议,就不应该用强制转换消除编译器对指针的警告。
关于c - c中&a,&a [0],a和有什么区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25008826/
10-10 02:15