C语言中int a[]、int *a1[]、int *a2有什么区别?

问题描述 投票:0回答:3

我是 C 新手,正在学习指针和数组。我的教授告诉我,我可以使用指针代替数组,反之亦然。但是,在编程的时候,我发现它们之间的用法是有一些区别的。例如,

int b[] = {1,2,3}; //I consider b as a pointer point to b[0]
int *ptr=b;
ptr++; //works well and point to 2
b++;  //I suppose it will point to b[1] but it doesn't work :(

这只是一个例子。我对

int a[]
int *a1[]
int *a2
(我知道基本概念)非常困惑,以及它们在内存模型中如何工作?指针/数组允许使用哪些语法(用法?)? (如上面的例子)
谢谢你~

c memory
3个回答
2
投票

嗯...

b
是一个数组。 b++ 什么也不做。它会返回错误,因为您正在递增到不可变变量。
因此,当您将指针
ptr
分配给数组
b
时,您就指向 数组的内存地址,并且默认情况下
ptr
将指向数组
b
中的零索引(即 1) ).
因此,当您编写
ptr++
时,您会将索引号增加 1,然后
ptr
指向
b
在该索引中保存的下一个索引值(ptr = b(这也表示 ptr = 0 ), b[0] = 1, ptr++, ptr = 1, b[1] = 2 等等..).
我希望这会有所帮助..


2
投票

指针和数组的概念或多或少是相同的,但数组有更多的限制。 数组包含内存中第一个元素的地址,但它是常量。 与任何其他 const 变量一样,您不能将分配给一个数组的值更改为另一个数组(或同一数组的另一个索引)。

关于语法,

int *a2
指向内存中的一个int,无论它是否只是一个整数、数组的一个元素,或者可能指向堆中的一块内存(分配有
malloc

int a[]
是数组的语法。数组是堆栈中的一块内存,无法更改或释放;它将在范围结束时被释放。

最后一个

int *a1[]
int*
的数组类型,这意味着它可以有类型为
int*
的元素,并且每个
int*
可以指向内存中的一个块或单个整数(4字节)或另一个数组或...

您还可以在这里阅读有关它们的信息: https://www.geeksforgeeks.org/difference-pointer-array-c/


1
投票

b
int b[] = {1,2,3};
的地址是不可变的(即不能更改)。因此,
b++
等都是非法的。

int a[]
int
的数组(仅包括一个
int
)。

int *a1[]
int *
的数组。这可用于
int
数组的数组。

int *a2
是指向
int
的指针。这可以指向单个
int
int
数组。

© www.soinside.com 2019 - 2024. All rights reserved.