所以a[10]
是一个int
数组。问题是,是否只有(a+5)
有效。如果是通过指针[ex:*(a+5)
]访问它,那么它应该是有效的。这是没有指针的吗?
答案 0 :(得分:3)
(a + 5)
相当于&a[5]
。在表达式中使用数组名称作为R值时,它将转换为指向数组第一个元素的指针。当您向指针添加n
时,它会将其递增到指针指向的数组中n
元素的地址。因此,只要n
小于数组大小,表达式就是有效的。此外,a + size
有效,但您不能间接通过它;它主要是允许的,所以你可以继续在循环中递增指针,直到它超出数组,你可以测试它是否已达到那个点。
请注意,C没有自动边界检查。如果计算无效指针(如+ 20),则无法保证会出现错误。这是C中未定义的行为,任何事情都可能发生,包括沉默。如果你从中读取,你可能会得到一些垃圾,但你也可能会遇到分段错误。如果你通过它写,你可能会破坏其他变量,结果可能非常难以预测。
答案 1 :(得分:2)
如果声明a[10]
,则a+5
和*(a+5)
都是有效的C.
a+5
是指向整数的指针,*(a+5)
是指针指向的值(整数)。
示例:
int a[10];
a[5] = 100;
printf("%d; %d\n", a[5], *(a+5)); // output: 100; 100
printf("%p; %p\n", &a[5], a+5); // output: two identical addresses
答案 2 :(得分:0)
数组不是指针。数组是不可修改的l值。 var testObject;
Object.defineProperty(testObject, 'myMethod', {
value: function () {
alert("Non enumerable property");
},
enumerable: false
});
//does not print myMethod since it is defined to be non-enumerable
console.log(Object.keys(testObject));
//prints myMethod irrespective of it being enumerable or not.
console.log(Reflect.ownKeys(testObject));
将评估为右值,并且只能用作右值
如果(a+5)
仍然是指针a
,则(a+5)
不能用作左值,因为+
运算符的结果是左值。