关于两段C语言代码中指针取值方式差异的技术问询
两段C语言代码的写法差异原因
这两种写法本质完全等价,核心原因是C语言的语法规则:数组下标运算符[]是指针偏移+解引用的语法糖,ptr[i]和*(ptr + i)是完全等价的写法,这是C语言标准明确规定的。
具体代码解释
第一段代码中使用
*(ptr+i),是直接写出了指针偏移后解引用的底层逻辑。如果把这段代码里的*(ptr+i)替换成ptr[i],运行结果不会有任何变化,只是写法更简洁。作者大概率是为了演示指针偏移运算的原理,才选择了这种更“直白”的底层写法。第二段代码里的
ptr[i]就是*(ptr+i)的简写,所以完全不需要额外加*。要是错误地写成*ptr[i]反而会导致程序出错:因为[]的优先级高于解引用运算符*,*ptr[i]会被编译器解析为*(ptr[i])——先通过ptr[i]拿到一个int类型的值,再试图对这个int值做解引用操作,这属于非法内存访问,会触发未定义行为(比如程序崩溃)。
补充说明:在函数参数列表中,int arr[]会被编译器自动转换为int *arr,所以第二段代码里printnumber函数的参数int arr[]和int *ptr本质是同一个东西,用arr[i]或者ptr[i]没有任何区别,底层都是*(arr+i)或*(ptr+i)的逻辑。
内容的提问来源于stack exchange,提问作者Rounak Dey
相关产品推荐
相关产品推荐

