我正在学习 C 的基础知识,我对字符串和数组感到困惑。
#include<stdio.h>
int main()
{
char arr[2][4] = {1,2,3,4,5,6,7,8};
printf("%u %u\n",arr,arr+1);
printf("%d",*(*(arr+1)+2) );
return 0;
}
这里arr
和arr+1
是相邻的位置,但在第二个printf
arr+1
中直接指向第二个数组的零索引元素。这怎么合法?我认为应该去第二个数组&arr+1
。
我学到的是 --> 对于一维数组:
arr[7]={1,2,3,4,5,6,7};
这里 arr 和 &arr 不应该被认为是相同的(虽然它们打印相同的值,但是这个信息的意义是完全不同的)。这就是为什么 arr+1 和 &arr+1 也不相同的原因。&arr 给出了一个数据类型的地址,该数据类型是 7 个整数的容器,这就是为什么 &arr+1 转到随后的数组类型,它也是一个 7 个整数的容器。所以
arr = 5796 , &arr = 5796 (both are base address but arr is the address of
1st element while &arr is the address of the whole array)
arr+1 = 5800 ,&arr+1 = (5796+(7X4))=5797+28 = 5825(this is address of some
new array)
对于二维数组,概念是相同的:
arr[2][4]={1,2,3,4,5,6,7,8};
now arr
is here 也是一个指向数组单个元素的指针,soarr
和arr+1
是其连续元素的地址(这些元素是{1,2,3,4}
and {5,6,7,8}
)_ 并且以相同的方式&arr
给出&arr+1
具有 2x4=8 元素的两个数组的基地址,所以to&arr
和&arr+1
是两个大小相似的数组的地址。所以
arr = 5796 , arr+1 = 5796+(4*3)=5796+12 = 5808
&arr = 5796 , &arr+1 = 5796+(4*7)=5796+ 28= 5824
现在我们可以看到在二维数组中到达一个单独的元素有两个关联的地址。
1)ar
r(给出在两个内部数组之间选择哪个元素)
2)*arr
(给出该特定元素(数组)中的哪个元素
因此,如果我们想访问数据,我们需要取消引用两次。
arr=5796(first array), *arr=5796(first element address), **arr = 1 (1st element)
arr+1=5812(second array), *(arr+1) = 5812(first element address), *(*(arr+1))=5(first element)
arr=5796,*arr=5796, *arr+1=5796+1(second element), *(*arr+1)=2 (second element)
现在数组的语法:
*arr = arr[0]
**arr = arr[0][0]
*arr+1 = arr[0]+1
**arr+1 = arr[0][0]+1
*(*arr+1) = *(arr[0]+1) = arr[0][1]
*(*(arr+1)+1) = *(arr[1]+1) = arr[1][1]
还有其他一些写数组的方法
3[arr[1]] = arr[1][3]
-3[arr[1]] = -arr[1][3]
*(1[arr]+2) = *(arr[1]+2) = arr[1][2]
这个概念也可以扩展到 3 维数组,但这是每个初学者都应该理解的最低要求。如果我在概念上或句法上的任何地方有错误,请纠正我。