Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的指针和内存混淆_C_Memory - Fatal编程技术网

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