二维数组指针代码中int *pj = *pi;无报错的技术疑问
二维数组指针的疑问解答
首先明确代码里的指针类型:
int (*pi)[4]是指向包含4个int的一维数组的指针,所以pi每次指向的是二维数组arr的一整行(比如指向第二行时,pi对应的是arr[1]这个int[4]类型的数组)。
你误解的核心点在这里:*pi并不是直接取出第二行的第一个元素5,而是解引用数组指针pi后,得到的是该行数组的数组名(arr[1])。在C/C++中,数组名在大多数表达式场景下(比如赋值给指针)会自动隐式转换为指向数组首元素的指针,也就是&arr[1][0]——这是一个int*类型的地址,正好和pj的类型匹配,所以赋值不会报错。
如果要取出5这个具体数值,你需要再解引用一次,也就是**pi,这时候才会拿到arr[1][0]的值5。
再拆解下循环逻辑:
- 外层循环:
pi从arr开始(arr会自动转成指向第一行的数组指针),每次pi++就跳到下一行的起始地址。 - 内层循环:
*pi转成该行首元素的指针赋值给pj,pj++依次指向该行的每个元素,*pj就是对应的元素值。
内容的提问来源于stack exchange,提问作者AleXtep
相关产品推荐
相关产品推荐

