使用指针增加变量

时间:2010-01-18 21:29:19

标签: c pointers

我对处理指针很新,而且我的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时,它不会似乎设置它。

正如我所说的,我对指针很新,所以我可能忽略了一些愚蠢的东西,但我一直在仔细研究我的代码,试图解决它。

提前致谢。

3 个答案:

答案 0 :(得分:9)

无法保证a, b, c, d, ef在内存中相邻。如果您需要这种保证,则需要使用数组。

#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++;
  }