C语言中的指针和内存混淆
如果我有以下代码行:C语言中的指针和内存混淆,c,memory,C,Memory,如果我有以下代码行: int* a[3]; 这是否意味着它是指向3个整数数组中第一项的指针(因此,它的大小为4字节)?还是说它是一个由3个指针组成的数组(大小为12字节)?它是C编程语言中指向int数据类型的指针数组。因此,该数组的每个元素都可以保存int数据类型变量的地址 int x=5, y=9, z=8; int *a[3]; // Declare an array of pointers to int a[0] = &x; a[1] = &y; a[2] =
int* a[3];
这是否意味着它是指向3个整数数组中第一项的指针(因此,它的大小为4字节)?还是说它是一个由3个指针组成的数组(大小为12字节)?它是
C
编程语言中指向int数据类型的指针数组。因此,该数组的每个元素都可以保存int
数据类型变量的地址
int x=5, y=9, z=8;
int *a[3]; // Declare an array of pointers to int
a[0] = &x;
a[1] = &y;
a[2] = &z;
但是,下面的声明将声明一个指向3 int的数组的指针
int (*a)[3];
a
的大小取决于编译代码的平台。请使用sizeof
运算符确定平台中的大小
int *a[3];
printf("Size of a: %zu\r\n", sizeof(a));
注意:
要打印sizeof运算符的结果,如果编译器支持C99,请使用%zu;否则,或者如果您想要最大的可移植性,打印size_t值的最佳方法是将其转换为unsigned long并使用%lu。您可以仔细阅读。您可以使用以下代码自己测试:
#include <stdio.h>
int main()
{
int *a[3];
printf("%zu\n", sizeof(a));
return 0;
}
可以使用括号(()
)更改类型声明的处理顺序:
int (*a)[3];
sizeof(a)
给它一个4的输出,在您的机器上是指针的大小
作为旁注,假设指针总是4个字节,而int
总是4个字节通常是不好的做法。这取决于体系结构、编译器、CPU模式等。为了理解表达式和声明,您必须了解运算符的先例。例如,网上有很多
在该页面上,您可以看到尖括号的优先级高于取消引用星号,这意味着它们首先应用。如果愿意,可以用括号括起声明的部分,就像在表达式中一样:
int *(a[10]); // brackets are redundant and show operator precedence
因此,变量a
必须是数组。在应用解引用运算符后,由索引产生的数组元素将产生一个int
,因此该元素必须是指向int的指针
因此,该声明声明了一个int指针数组
另外,您不能声明指向不带括号或typedef的数组的指针,因为运算符的前导是针对上述更常见的情况而创建的。指向数组的指针如下所示:
int (*a)[10]; // brackets are necessary to make "*" apply first
这里,首先应用解引用星号<因此,代码>a
必须是指针。结果类型可以被索引,因此必须是一个数组,其元素被声明为int
s。这使得a
成为指向int
s数组的指针 将其插入C声明->英语翻译程序:这是一个指向int
的3个指针数组:不管怎样,不要猜测大小,使用a
的大小。为什么3个指针的数组是12字节?什么保证指针为4字节?为什么不使用sizeof a
并检查它呢?如果您试图学习,那么重要的是变量a
的类型,它的大小不容易预测。对于size\u t
值,可能重复使用“%zu”
,而不是“%d”
。
int (*a)[10]; // brackets are necessary to make "*" apply first