我对处理指针很新,而且我的C知识相当小。我想了解指针。我编写了以下代码来打印变量列表(a到f),如下所示:
0
1
2
3
4
5
我编写了以下代码来执行此操作:
#include <stdio.h>
int main(){
int a,b,c,d,e,f;
int *p;
int i;
a = b = c = d = f = 0;
p = &a;
for (i = 0; i < 5; i++){
*p += i;
printf("%d\n", *p);
p++;
}
return 0;
}
这个想法是它通过变量和增量逐个增加(i)。我假设你在同时初始化变量时,它们会在内存中彼此相邻。但是,我得到以下输出:
0
1
2
3
-1218283607
如果我将for循环更改为仅从0到3(i <4),它工作正常,打印机0 1 2和3.但是当我希望打印变量f时,它不会似乎设置它。
正如我所说的,我对指针很新,所以我可能忽略了一些愚蠢的东西,但我一直在仔细研究我的代码,试图解决它。
提前致谢。
答案 0 :(得分:9)
无法保证a, b, c, d, e
和f
在内存中相邻。如果您需要这种保证,则需要使用数组。
#include <stdio.h>
int main() {
int a[6];
int *p;
int i;
a[0] = a[1] = a[2] = a[3] = a[4] = a[5] = 0;
p = &a[0];
for (i = 0; i < 6; i++){
*p += i;
p++;
}
for(i = 0; i < 6; i++) {
printf("%d\n", a[i]);
}
return 0;
}
这里int a[6]
声明一个名为a
的数组,它可以容纳六个整数。这六个整数可以通过a[0]
,a[1]
,a[2]
,a[3]
,a[4]
和a[5]
获得。我们保证a[0]
,a[1]
,a[2]
,a[3]
,a[4]
和a[5]
在内存中连续排列。这样一行
p = &a[0];
将p
设置为第一个元素的地址。此指针的每个增量都会向前移动数组中的一个位置。
第二个for
循环显示第一个for循环在a[i]
中为i
正确设置i
到{0, 1, 2, 3, 4, 5}
。如果你运行这个程序,你会看到
0
1
2
3
4
5
在控制台上。
答案 1 :(得分:3)
您忘记初始化e
。但是,请使用打包数组。
答案 2 :(得分:1)
假设堆栈变量以任何特定顺序排列在内存中是不安全的。
您需要使用数组,结构或可能的联合来保证您的整数的排序。
union {
int ary[6];
struct {
int a;
int b;
int c;
int d;
int e;
int f;
} s;
} u = {0};
p = &u.s.a;
for (i = 0; i < 5; i++){
*p += i;
printf("%d\n", *p);
p++;
}