什么';C中的-int*和int*[100]类型之间的区别是什么?
有点傻,所以别在这里杀了我 以下代码之间有什么区别什么';C中的-int*和int*[100]类型之间的区别是什么?,c,pointers,C,Pointers,有点傻,所以别在这里杀了我 以下代码之间有什么区别 int *p; //As i understand, it creates a pointer to an variable of size int. int *p[100]; //Don't really know what this is. int (*p)[100]; // I have come to understand that this is a pointer to an array. 这是指向int
int *p; //As i understand, it creates a pointer to an variable of size int.
int *p[100]; //Don't really know what this is.
int (*p)[100]; // I have come to understand that this is a pointer to an array.
int
的指针:
int *p;
int *p[100];
int (*p)[100];
┌────┐
│int*│
└────┘
它应该指向一个int
,如下所示:
┌────┐
│int*│
└─┃──┘
▼
┌───┐
│int│
└───┘
int
的指针的数组:
int *p;
int *p[100];
int (*p)[100];
也就是说,它给你100个指针
┌────┬────┬────┬────┬────┬────┬┄
│int*│int*│int*│int*│int*│int*│
└────┴────┴────┴────┴────┴────┴┄
每个指针应指向一个int
,可能如下所示:
┌────┬────┬────┬────┬────┬────┬┄
│int*│int*│int*│int*│int*│int*│
└─┃──┴─┃──┴─┃──┴─┃──┴─┃──┴─┃──┴┄
▼ ▼ ▼ ▼ ▼ ▼
┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐┌┄
│int││int││int││int││int││int││
└───┘└───┘└───┘└───┘└───┘└───┘└┄
当然,没有理由它们不能都指向同一个int
,或者其他任何东西
如果需要许多可以轻松使用的指针,则可能需要使用指针数组
迭代。例如,您可以动态分配对象,并使每个指针指向不同的对象:
p[0] = new int(0);
p[1] = new int(0);
// ...
也许动态分配int
s不是最好的例子,但我认为重点很清楚
int
:
int *p;
int *p[100];
int (*p)[100];
也就是说,它只给您一个指针:
┌───────────┐
│国际(*)[100]│
└───────────┘
它应该指向包含100int
s的数组:
┌───────────┐
│国际(*)[100]│
└─┃─────────┘
▼
┌───┬───┬───┬───┬───┬───┬┄
│int│int│int│int│int│int│
└───┴───┴───┴───┴───┴───┴┄
在数组名称上使用运算符(&
)的地址时,将获得指向数组的指针。例如:
int arr[100] = { /* some initial values */ };
int (*p)[100] = &arr;
这里,我获取了arr
数组的地址,它给了我一个指向该数组的指针。如果随后要访问数组的某个元素,则必须首先取消对指针的引用:(*p)[3]
将访问元素3
旁注: 始终记住。正如我们刚才看到的,我们可以使用数组的地址来获得指针,就像C++中的任何其他(非临时)对象一样。数组和指针之间唯一的特殊联系是数组的名称可以隐式转换为指向数组第一个元素的指针。这意味着以下各项有效:
int arr[100] = { /* some initial values */ };
int* p = arr;
指针p
将指向arr
中的第一个元素。请注意,p
不是指向数组的指针,而是指向数组元素的指针
(还请注意,没有数组类型的函数参数。如果您编写类似于int p[]
的函数参数,编译器会将其转换为int*
)int*p代码>-->声明指向整数类型的指针。
int*p[100]代码>-->声明一个包含100个指向整数类型指针的数组。
int(*p)[100]代码>-->声明指向100个整数数组的指针
用于翻译此类类型。听起来您可以使用
从变量开始,从右到左“螺旋”旋转:
+-------+
| +--+ | // So we have:
| | | | p // p
int * p | | * p // p is a pointer
^ ^ | | int * p // p is a pointer to an int
| +----+ |
+----------+
下一个:
+--------+
| +--+ | p // p
| | V | p[100] // p is an array of 100
int * p[100] | * p[100] // p is an array of 100 pointers
^ ^ | | int * p[100] // p is an array of 100 pointers to ints
| +----+ |
+-----------+
最后,规则的一个新部分,先做括号中的任何事情:
+-----+
| +-+ |
| ^ | | ( p) // p
int (* p) [100]; (*p) // p is a pointer
^ ^ | | (*p)[100] // p is a pointer to an array of 100
| +---+ | int (*p)[100] // p is a pointer to an array of 100 ints
+---------+
如果你在线/可以访问计算机,使用网站总是很有用的,但是能够离线阅读代码也很重要,这条规则可以让你做到这一点
有点傻所以别在这里杀了我
即使对于专家来说,计算类型在C中的含义也是一件棘手的事情。不用担心
以下代码之间有什么区别
int *p; //As i understand, it creates a pointer to an variable of size int.
int *p[100]; //Don't really know what this is.
int (*p)[100]; // I have come to understand that this is a pointer to an array.
其他答案都很好,我无意反驳。相反,这里还有另一种思考的方式。我们需要定义三件事:
- 变量是一种支持三种操作的东西。fetch操作获取一个变量并生成其当前值。fetch操作没有符号;您只需使用变量。存储操作获取一个变量和一个值,并将该值存储在变量中。address操作接受一个变量并生成一个指针
- 指针是支持一个操作的东西。作为前缀
*指针编写的解引用操作获取指针并生成变量。(指针支持其他操作,如算术和索引——这是算术的一种形式——但我们不必说了。)
- 数组是支持一个操作的东西。索引操作获取一个数组和一个整数,并生成一个变量。它的语法是后缀:
array[index]
好,现在我们来回答你的问题。声明的内容是什么
int p;
int *p[100];
什么意思?表达式p
是int
类型的变量。注意,这是一个变量;您可以将东西存储到p
。声明的内容是什么
int *p;
什么意思?表达式*p
是int
类型的变量。现在我们知道了