关于 char 指针,sizeof 运算符如何工作?
With respect to char pointer, how does the sizeof operator work?
下面是代码(用gcc编译):
#include <stdio.h>
#include<string.h>
int main()
{
char *c="hello";
printf("1) sizeof 'hello' : %d \n",sizeof("hello"));
printf("2) sizeof '*c' : %d \n",sizeof(*c));
printf("3) sizeof 'c': %d \n",sizeof(c));
printf("4) sizeof '&c' : %d \n",sizeof(&c));
printf("5) sizeof '&hello': %d \n",sizeof(&("hello")));
printf("\n");
return 0;
}
给定程序的输出:
1) sizeof 'hello' : 6
2) sizeof '*c' : 1
3) sizeof 'c': 8
4) sizeof '&c' : 8
5) sizeof '&hello': 8
因此,对于情况 1) 和 2),为什么会出现此输出没有问题。
但是对于其余情况,即 3)、4) 和 5),为什么 sizeof
运算符给出 8?
据我所知,&c
、c
和 &"hello"
代表同一事物,即一组字符(即 c
指向 'hello' ) 和 *c
表示单个字符(即 *c
指向 'h')。
那么,为什么 sizeof(c)
给出 8 而不是 6?这个8是怎么算出来的?
c
是指向 char
的指针。 64 位系统上任何指针的大小都是 8 个字节。
"hello"
是一个字符数组(实际上是 char const[6]
)。这就是为什么 sizeof("hello")
是 6.
当您写入 c = "hello";
时,数组 "hello"
衰减为指向其第一个元素的指针。
sizeof
只检查参数的类型,从不检查它的值。
"hello"
是类型 char const[6]
的左值。数组对象的大小就是元素的大小乘以边界。 char
的大小定义为1,因此sizeof *c
为1,sizeof "hello"
为6*1=6。
指针通常有 4 或 8 个字节大 - 在您的平台上它是 8 个字节,如
的值所示
sizeof c
.
sizeof (&c)
和 sizeof(&("hello"))
为您提供与 sizeof c
相同的输出。同样,只是指针的大小。
两者大相径庭:
- "hello" 是六个字符的数组。
- c 是一个指针(指向一个字符)。
- &c也是一个指针(指向指针)。
- &"hello" 是一个指针(指向六个字符的数组)。
在某些情况下,它们的行为相同,因为在某些用例中 char 数组会退化为 char 指针。但是,这是一种转换,不会改变它们的本来面目!
下面是代码(用gcc编译):
#include <stdio.h>
#include<string.h>
int main()
{
char *c="hello";
printf("1) sizeof 'hello' : %d \n",sizeof("hello"));
printf("2) sizeof '*c' : %d \n",sizeof(*c));
printf("3) sizeof 'c': %d \n",sizeof(c));
printf("4) sizeof '&c' : %d \n",sizeof(&c));
printf("5) sizeof '&hello': %d \n",sizeof(&("hello")));
printf("\n");
return 0;
}
给定程序的输出:
1) sizeof 'hello' : 6
2) sizeof '*c' : 1
3) sizeof 'c': 8
4) sizeof '&c' : 8
5) sizeof '&hello': 8
因此,对于情况 1) 和 2),为什么会出现此输出没有问题。
但是对于其余情况,即 3)、4) 和 5),为什么 sizeof
运算符给出 8?
据我所知,&c
、c
和 &"hello"
代表同一事物,即一组字符(即 c
指向 'hello' ) 和 *c
表示单个字符(即 *c
指向 'h')。
那么,为什么 sizeof(c)
给出 8 而不是 6?这个8是怎么算出来的?
c
是指向 char
的指针。 64 位系统上任何指针的大小都是 8 个字节。
"hello"
是一个字符数组(实际上是 char const[6]
)。这就是为什么 sizeof("hello")
是 6.
当您写入 c = "hello";
时,数组 "hello"
衰减为指向其第一个元素的指针。
sizeof
只检查参数的类型,从不检查它的值。
"hello"
是类型 char const[6]
的左值。数组对象的大小就是元素的大小乘以边界。 char
的大小定义为1,因此sizeof *c
为1,sizeof "hello"
为6*1=6。
指针通常有 4 或 8 个字节大 - 在您的平台上它是 8 个字节,如
的值所示
sizeof c
.
sizeof (&c)
和 sizeof(&("hello"))
为您提供与 sizeof c
相同的输出。同样,只是指针的大小。
两者大相径庭:
- "hello" 是六个字符的数组。
- c 是一个指针(指向一个字符)。
- &c也是一个指针(指向指针)。
- &"hello" 是一个指针(指向六个字符的数组)。
在某些情况下,它们的行为相同,因为在某些用例中 char 数组会退化为 char 指针。但是,这是一种转换,不会改变它们的本来面目!