CodeBlocks 如何增加变量地址,特别是 C 中的指针?
How does CodeBlocks increment variable addresses, specifically for pointers in C?
我正在学习 C 的介绍性 class。我们刚刚介绍了指针,而我们当前的实验只是将我们的代码从数组表示法更改为指针表示法。我知道在 Codeblocks 中,存储一个 int 变量需要 4 个字节。因此,我将一个指针分配给数组的前面,并且根据 class 的讲座和实验,我知道通过递增指针,我可以更改指针指向的数组元素.我认为递增 4 将允许我转到数组的下一个元素。
但是,每当我打印指针 运行 pointer+=4
并再次打印指针时,它实际上会将我的指针值更改为 16。实际上,任何增量都会按其倍数更改共 4 个。目前,我的代码 运行 使用 pointer++
.
没问题
我的代码 运行 很好,所以这应该不是问题,但我想知道是否有人可以给我更多关于为什么会这样的信息,以及关于 Codeblocks 的任何其他信息存储内存?
指针运算总是在指针的基本单元中完成。因此,如果您有一个指向 int
的指针(即 int *
),那么对该指针进行算术运算将以 int
.
为单位
所以假设你有
int arr[] = { 1, 2, 3, 4 };
int *ptr = arr;
然后ptr
将指向数组中的第一个元素,arr[0]
。
现在,如果我们增加指针 ptr
,如 ptr = ptr + 1
(或 ptr += 1
或 ptr++
),那么 ptr
将指向数组 arr[1]
.
如果您需要将其可视化,让我们用指针和一些指针算法“绘制”数组 arr
:
+-----+-----+-----+-----+
| 1 | 2 | 3 | 4 |
+-----+-----+-----+-----+
^ ^ ^ ^
| | | |
ptr ptr+1 ptr+2 ptr+3
从这里你应该开始看到一个对应于数组索引的模式...... ptr + 1
指向第二个元素,就像arr[1]
(和ptr[1]
)是值第二个元素的。
事实上,所有这些都是 arr[i]
正好等于 *(arr + i)
和 array-to-pointer 衰减的基础。
我正在学习 C 的介绍性 class。我们刚刚介绍了指针,而我们当前的实验只是将我们的代码从数组表示法更改为指针表示法。我知道在 Codeblocks 中,存储一个 int 变量需要 4 个字节。因此,我将一个指针分配给数组的前面,并且根据 class 的讲座和实验,我知道通过递增指针,我可以更改指针指向的数组元素.我认为递增 4 将允许我转到数组的下一个元素。
但是,每当我打印指针 运行 pointer+=4
并再次打印指针时,它实际上会将我的指针值更改为 16。实际上,任何增量都会按其倍数更改共 4 个。目前,我的代码 运行 使用 pointer++
.
我的代码 运行 很好,所以这应该不是问题,但我想知道是否有人可以给我更多关于为什么会这样的信息,以及关于 Codeblocks 的任何其他信息存储内存?
指针运算总是在指针的基本单元中完成。因此,如果您有一个指向 int
的指针(即 int *
),那么对该指针进行算术运算将以 int
.
所以假设你有
int arr[] = { 1, 2, 3, 4 };
int *ptr = arr;
然后ptr
将指向数组中的第一个元素,arr[0]
。
现在,如果我们增加指针 ptr
,如 ptr = ptr + 1
(或 ptr += 1
或 ptr++
),那么 ptr
将指向数组 arr[1]
.
如果您需要将其可视化,让我们用指针和一些指针算法“绘制”数组 arr
:
+-----+-----+-----+-----+ | 1 | 2 | 3 | 4 | +-----+-----+-----+-----+ ^ ^ ^ ^ | | | | ptr ptr+1 ptr+2 ptr+3
从这里你应该开始看到一个对应于数组索引的模式...... ptr + 1
指向第二个元素,就像arr[1]
(和ptr[1]
)是值第二个元素的。
事实上,所有这些都是 arr[i]
正好等于 *(arr + i)
和 array-to-pointer 衰减的基础。