gpt4 book ai didi

c - 为什么数组的大小和指向第一个元素的指针不同?

转载 作者:行者123 更新时间:2023-12-04 09:47:15 24 4
gpt4 key购买 nike

Kernighan & Ritchie 第 2 版。说:

The correspondence between indexing and pointer arithmetic is very close. By definition, the value of a variable or expression of type array is the address of element zero of the array. Thus after the assignment
pa = &a[0];

pa and a have identical values. Since the name of an array is a synonym for the location of the initial element, the assignment pa=&a[0] can also be written as
pa = a;

如果 apa 相同,那么为什么这段代码:

#include <stdio.h>

int main()
{
char a[] = "hello";
char *pa = a;
printf("Array: %ld\n", sizeof(a));
printf("Pointer: %ld\n", sizeof(pa));
}

输出这个:

Array: 6
Pointer: 8

如果能引用权威来源,我们将不胜感激。

最佳答案

两个对象可以有相同的地址,但它们的大小可以不同。

来自 C 标准(6.5.3.4 sizeof 和 alignof 运算符)

2 The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand....

考虑下面的例子

#include <stdio.h>

int main( void )
{
struct A
{
char c;
int x;
} a;

printf( "object a:\taddress - %p size - %zu\n",
&a, sizeof( a ) );
printf( "object a.c:\taddress - %p size - %zu\n",
&a.c, sizeof( a.c ) );
}

程序输出为

object a:   address - 0x7fff164e16d0 size - 8
object a.c: address - 0x7fff164e16d0 size - 1

正如所见,struct A 类型的对象 a 及其 char 类型的数据成员 c地址相同但大小不同。

对于数组,指针是存储其他对象地址的对象。要存储其他对象的地址,根据使用的系统为指针分配例如 4 或 8 个字节的内存就足够了。

至于数组,它们被命名为内存范围。数组不存储地址。它们存储自己的元素(当然可以是指针)。

表达式中使用的数组名称被转换为指向其第一个元素的指针。

根据 C 标准(6.3.2.1 左值、数组和函数指示符)

3 Except when it is the operand of the sizeof operator or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type’’ is converted to an expression with type ‘‘pointer to type’’ that points to the initial element of the array object and is not an lvalue. If the array object has register storage class, the behavior is undefined.

在这个引用中列出了数组未转换为指向其第一个元素的指针的情况。例如,当数组是 sizeof 运算符的操作数时。

如果回到你的程序

int main()
{
char a[] = "hello";
char *pa = a;
printf("Array: %ld\n", sizeof(a));
printf("Pointer: %ld\n", sizeof(pa));
}

然后在这个声明中

    char a[] = "hello";

具有 char[6] 类型的字符串文字 "Hello" 不会转换为指针。然而在这个声明中

    char *pa = a;

数组 a 被转换为指向其第一个元素的指针。

在这个声明中

    printf("Array: %ld\n", sizeof(a));

数组 a 不会转换为指针,因为它是 sizeof 运算符的操作数。

但是,如果您在 sizeof 运算符中使用表达式,例如像这样

sizeof( a + 0 )

然后你会得到一个指针,相应地 sizeof 会返回指针的大小而不是数组的大小

关于c - 为什么数组的大小和指向第一个元素的指针不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32099990/

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