指向数组的指针与数组名称有何不同?
How is pointer to array different from array names?
我阅读了更多有关 C 中数组与指针的信息,并编写了以下程序。
#include <stdio.h>
int arr[10] = { } ;
typedef int (*type)[10] ;
int main()
{
type val = &arr ;
printf("Size is %lu\n", sizeof(val)) ;
printf("Size of int is %lu\n", sizeof(int)) ;
}
如果,我执行这个程序,那么sizeof(val)
给8,sizeof(int)
给4。
如果 val
是指向包含 10 个元素的数组的指针,它的大小不应该是 40。为什么 sizeof(val)
是 8?
If val is a pointer to the array...
是的,sizeof(val)
生成“指向数组的指针”的大小,而不是数组本身。
...shouldn't it's size be 40.?
不是,sizeof(val)
计算操作数的大小,这里的"pointer"。在您的平台中,指针的大小似乎是 64 位,即 8 个字节。所以,它给出 8
.
此外,正如我提到的,使用 %zu
打印 size_t
,由 sizeof
运算符生成的类型。
sizeof returns 指针本身的大小。在 64 位系统中为 8 个字节。
指针不知道它们指向的缓冲区的大小。
A pointer
是一种独特的数据类型,并且始终具有固定大小。将指针视为指向实际数据的符号,并且符号始终具有相同的大小 - 无论它指向单个字符还是更大的数组。
val
是指针,其大小相当于系统的地址总线大小。
所以,sizeof(val)
或 sizeof(anyPointer)
会给你 8
作为输出。
如果你想要 40
然后尝试 sizeof(arr)
.
指向数组的指针是简单的指针,您可以在其中写 val++
而数组名称是 constant pointer
您不能写 arr++
.
你也可以查看这个link
首先初始化一个数组
int arr[10] = { } ;
在 C 中无效。您不能在 C 中使用空大括号(在 C++ 中是允许的)。你必须写
int arr[10] = { 0 } ;
在C中对应的初始化器定义如下
initializer:
{ initializer-list }
{ initializer-list , }
在 C++ 中
braced-init-list:
{ initializer-list ,opt }
{ }
至于这个说法
printf("Size is %lu\n", sizeof(val)) ;
那么 val
是一个指针,因为它的类型 type
定义为
typedef int (*type)[10] ;
将此语句更改为
printf( "Size is %zu\n", sizeof( *val ) );
如果你想得到指针指向的对象(即数组)的大小。
很可能您在 64 bit
PC 中,内存地址需要 64 bits
或 8 byte
space 来表示。
现在 pointer
实际上保存的是内存地址,而它可能保存的是 int
或者可能是 int[]
的地址,没关系。
所以,当你执行时,
printf("Size is %lu\n", sizeof(val)) ;
它显示 8
因为指针保存需要 64 bits
space.
的地址
和
printf("Size of int is %lu\n", sizeof(int)) ;
这一行只打印 int
的大小,即 4
字节。
我阅读了更多有关 C 中数组与指针的信息,并编写了以下程序。
#include <stdio.h>
int arr[10] = { } ;
typedef int (*type)[10] ;
int main()
{
type val = &arr ;
printf("Size is %lu\n", sizeof(val)) ;
printf("Size of int is %lu\n", sizeof(int)) ;
}
如果,我执行这个程序,那么sizeof(val)
给8,sizeof(int)
给4。
如果 val
是指向包含 10 个元素的数组的指针,它的大小不应该是 40。为什么 sizeof(val)
是 8?
If val is a pointer to the array...
是的,sizeof(val)
生成“指向数组的指针”的大小,而不是数组本身。
...shouldn't it's size be 40.?
不是,sizeof(val)
计算操作数的大小,这里的"pointer"。在您的平台中,指针的大小似乎是 64 位,即 8 个字节。所以,它给出 8
.
此外,正如我提到的,使用 %zu
打印 size_t
,由 sizeof
运算符生成的类型。
sizeof returns 指针本身的大小。在 64 位系统中为 8 个字节。 指针不知道它们指向的缓冲区的大小。
A pointer
是一种独特的数据类型,并且始终具有固定大小。将指针视为指向实际数据的符号,并且符号始终具有相同的大小 - 无论它指向单个字符还是更大的数组。
val
是指针,其大小相当于系统的地址总线大小。
所以,sizeof(val)
或 sizeof(anyPointer)
会给你 8
作为输出。
如果你想要 40
然后尝试 sizeof(arr)
.
指向数组的指针是简单的指针,您可以在其中写 val++
而数组名称是 constant pointer
您不能写 arr++
.
你也可以查看这个link
首先初始化一个数组
int arr[10] = { } ;
在 C 中无效。您不能在 C 中使用空大括号(在 C++ 中是允许的)。你必须写
int arr[10] = { 0 } ;
在C中对应的初始化器定义如下
initializer:
{ initializer-list }
{ initializer-list , }
在 C++ 中
braced-init-list:
{ initializer-list ,opt }
{ }
至于这个说法
printf("Size is %lu\n", sizeof(val)) ;
那么 val
是一个指针,因为它的类型 type
定义为
typedef int (*type)[10] ;
将此语句更改为
printf( "Size is %zu\n", sizeof( *val ) );
如果你想得到指针指向的对象(即数组)的大小。
很可能您在 64 bit
PC 中,内存地址需要 64 bits
或 8 byte
space 来表示。
现在 pointer
实际上保存的是内存地址,而它可能保存的是 int
或者可能是 int[]
的地址,没关系。
所以,当你执行时,
printf("Size is %lu\n", sizeof(val)) ;
它显示 8
因为指针保存需要 64 bits
space.
和
printf("Size of int is %lu\n", sizeof(int)) ;
这一行只打印 int
的大小,即 4
字节。