+ 5是C中的有效表达式,其中a是数组吗?

时间:2015-12-24 07:43:44

标签: c

所以a[10]是一个int数组。问题是,是否只有(a+5)有效。如果是通过指针[ex:*(a+5)]访问它,那么它应该是有效的。这是没有指针的吗?

3 个答案:

答案 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)不能用作左值,因为+运算符的结果是左值。