gpt4 book ai didi

c - 为什么我不能像 C 中的指针一样对待数组?

转载 作者:太空狗 更新时间:2023-10-29 17:15:38 25 4
gpt4 key购买 nike

我经常在 SO 上看到这个问题。也许不是那么多的话......但是一次又一次地混淆了数组与指针的不同之处。所以我想我会花点时间来问答一些关于这个的要点。

为了本问答的目的,我们将假设一个 32 位系统并且已声明以下内容:

char * ptr = "hello";
char arr[10] = "hello";
int iarr[10] = {0};

这是一个问题列表,可以推测我在 SO 上看到的混淆。当我看到新的问题时,我会添加到我的问答列表中(其他人也可以随意添加,如果您发现任何错误,请纠正我!)

  1. 指针和数组基本上不是一回事吗?
  2. 跟进:*(ptr)*(arr),或者 ptr[0]arr[0 ] 给出同样的东西,为什么?
  3. 为什么arr&arr是同一个值?
  4. 跟进:为什么我在打印 arr+1&arr+1 时得到不同的值?

最佳答案

1) 指针不是数组。数组不是指针。不要那样想它们,因为它们是不同的。
我怎样才能证明这一点?想一想它们在内存中的样子:

我们的数组 arr 有 10 个字符长。它包含“Hello”,但是等等,这还不是全部!因为我们有一个比我们的消息更长的静态声明数组,我们得到了一堆 NULL 字符 ('\0') 免费抛出!另外,请注意名称 arr 在概念上是如何附加到连续字符的(它没有指向任何东西)。 enter image description here

接下来考虑我们的指针在内存中的样子: enter image description here请注意,这里我们指向的是只读存储器中某处的字符数组。

因此虽然 arrptr 的初始化方式相同,但它们的内容/位置实际上是不同的。

这里是重点:
ptr是一个变量,我们可以指向任何东西,arr是一个常量, 它将始终引用这 10 个字符的 block 。


2) [] 是可用于地址的“添加和引用”运算符。这意味着 arr[0]*(arr+0) 相同。所以是的,这样做:

printf("%c %c", *(arr+1), *(ptr+1));

会给你一个输出“e e”。这并不是因为数组是指针,而是因为数组 arr 和指针 ptr 的名称恰好都给了你一个地址。

#2 的要点:遵从运算符 * 和添加和遵从运算符 [] 并不分别特定于指针和数组.这些运算符只是处理地址。


3) 我没有一个非常简单的答案......所以让我们暂时忘记我们的字符数组,看看这个例子以获得解释:

int b;   //this is integer type
&b; //this is the address of the int b, right?

int c[]; //this is the array of ints
&c; //this would be the address of the array, right?

所以这很容易理解:

*c;   //that's the first element in the array

这行代码告诉你什么?如果我引用 c,那么我得到一个 int。这意味着 c 只是一个地址。因为它是数组的开始,它是数组的地址,也是数组中第一个元素的地址,因此从值的角度来看:

c == &c;

4) 让我暂时偏离主题......最后一个问题是地址算术混淆的一部分。我曾在 SO 上看到一个问题,暗示地址只是整数值……您需要了解在 C 中地址具有类型知识。也就是说:

iarr+1; //We added 1 to the address, so we moved 4 bytes
arr+1; //we added 1 to the address, so we moved 1 byte

基本上 sizeof(int) 是 4 而 sizeof(char) 是 1。所以“将 1 加到数组”并不像看起来那么简单。

那么现在,回到问题,为什么arr+1&arr+1 不同?第一个是将1 * sizeof(char)=1 添加到地址,第二个是将1 * sizeof(arr)=10 添加到地址。

这就是为什么即使它们都“只加 1”,它们也会给出不同的结果。

关于c - 为什么我不能像 C 中的指针一样对待数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12676402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com