gpt4 book ai didi

c - 在 C 中,数组的名称是指向它第一个元素的指针,不是吗?

转载 作者:行者123 更新时间:2023-12-04 11:26:39 24 4
gpt4 key购买 nike

在下面的示例代码中,我使用字符串作为数组,如果str的名称是指向str的第一个元素的指针,在这种情况下string的第一个字符,即s,str的大小应该是 8,但它给出的是 6。

#include <stdio.h>

char str[] = "string";
char *ptr = "string";

int main(void){
int first = sizeof(str);
int second = sizeof(str[0]);
int third = sizeof(ptr);
int size_of_array = sizeof(str)/sizeof(str[0]);
printf("the size is %d, %d, %d, %d", size_of_array, first, second, third);
return 0;
}

好像str不是指针,str的大小不是ptr的大小?我对 t 感到困惑

最佳答案

首先,您的问题的核心:编译器严格按照声明大小处理 sizeof。在下面的代码中,假设一个指针变量 持有一个 32 位(4 字节)的地址:

char str1[] = "abcd";
char *pstr = str1;

// str1 is declared to be a fixed array of 5 chars (4+nul)
size_t str1size = sizeof(str1); // str1size = 5;

// pstr is declared to be a 32 bit pointer to a memory address.
size_t pstrSize = sizeof(pstr) // size of a 32 bit pointer; 4.

要掌握您所看到的结果,请查看数组和指针变量的差异(它们比大多数人想象的要少)。

数组和指针变量在C语言中的核心区别是

  • 指针变量保存一个地址;声明的数组一个地址。
  • 因此,声明的数组不能修改它们的“地址”(因为它们地址,它们不保存地址像一个指针变量)。

如果您想真正了解 C 中的数组和指针,那么我对其中的第一个强调不够。除此之外,它们之间的关系充其量是乱伦的。指针变量是地址,如数组(或任何其他变量)。但与数组不同的是,它们还保存一个地址作为它们的。数组它们的地址。

第一个最好用以下方式展示:

char str1[] = "abcd";
char *pstr = NULL;

pstr = str1; // ok. pstr holds the address *at* str1.
str1[0] = *pstr; // ok. copies 'a' on to 'a'.
pstr++; // ok. increment the address held in pstr by one item (char) size.
str1[0] = *pstr; // ok. copies 'b' over 'a'.
pstr = str1+1; // ok. pstr holds the address *at* str1 + one item (char) size.
str1 = pstr; // does not compile. str1's address cannot be changed.

请注意,指针变量本身保存一个地址,而固定数组一个地址。因此,最后一个语句被颠倒是完全没问题的。

pstr = str1;          // ok. put the str1 address in pstr, a pointer variable.

关于c - 在 C 中,数组的名称是指向它第一个元素的指针,不是吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13005070/

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