Увеличение переменных с помощью указателей - PullRequest
3 голосов
/ 19 января 2010

Я очень плохо знаком с указателями, и мои знания 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, это не кажется установить его. </p>

Как я уже сказал, я очень новичок в указателях, поэтому я, вероятно, упустил из виду что-то глупое, но я перебирал свой код снова и снова, пытаясь решить его.

Заранее спасибо.

Ответы [ 3 ]

9 голосов
/ 19 января 2010

Нет гарантии, что 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

на консоли.

3 голосов
/ 19 января 2010

Вы забыли инициализировать e. Но да, используйте упакованный массив.

1 голос
/ 19 января 2010

Нельзя предположить, что переменные стека расположены в памяти в каком-либо определенном порядке.

Вам нужно использовать массив, структуру или, возможно, объединение, чтобы гарантировать порядок ваших целых.

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++;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...