我是 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
(我知道基本概念)非常困惑,以及它们在内存模型中如何工作?指针/数组允许使用哪些语法(用法?)? (如上面的例子)嗯...
b
是一个数组。 b++ 什么也不做。它会返回错误,因为您正在递增到不可变变量。ptr
分配给数组 b
时,您就指向 数组的内存地址,并且默认情况下 ptr
将指向数组 b
中的零索引(即 1) ).ptr++
时,您会将索引号增加 1,然后 ptr
将指向 b
在该索引中保存的下一个索引值(ptr = b(这也表示 ptr = 0 ), b[0] = 1, ptr++, ptr = 1, b[1] = 2 等等..).指针和数组的概念或多或少是相同的,但数组有更多的限制。 数组包含内存中第一个元素的地址,但它是常量。 与任何其他 const 变量一样,您不能将分配给一个数组的值更改为另一个数组(或同一数组的另一个索引)。
关于语法,
int *a2
指向内存中的一个int,无论它是否只是一个整数、数组的一个元素,或者可能指向堆中的一块内存(分配有malloc
)
int a[]
是数组的语法。数组是堆栈中的一块内存,无法更改或释放;它将在范围结束时被释放。
最后一个
int *a1[]
是int*
的数组类型,这意味着它可以有类型为int*
的元素,并且每个int*
可以指向内存中的一个块或单个整数(4字节)或另一个数组或...
您还可以在这里阅读有关它们的信息: https://www.geeksforgeeks.org/difference-pointer-array-c/
b
中int b[] = {1,2,3};
的地址是不可变的(即不能更改)。因此,b++
等都是非法的。
int a[]
是 int
的数组(仅包括一个 int
)。
int *a1[]
是 int *
的数组。这可用于 int
数组的数组。
int *a2
是指向int
的指针。这可以指向单个 int
或 int
数组。