Массивы указателей в C - PullRequest
       2

Массивы указателей в C

2 голосов
/ 11 августа 2010

Hii,

Я написал следующий код, чтобы улучшить его для более высоких структур данных.

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

int display(int *a , int *b , int *c)
 {
  a[0] = b;
  a[1] = c;
  printf("\n%d %d",a[0],a[1]);                ------- point 1
  printf("\n %d %d",*(a[0]),*(a[1]));         ------- point 2
  return 1;
 } 
int main()
 {
  int *a[5];
  int b,c;
  scanf("%d %d",&b,&c);
  printf("%d %d",b,c);
  display(a,&b,&c);
  getchar();
 }

Я получаю адреса в пункте 1, но я не получаю значений в пункте 2 ... Что я сделал не так ... Если моя программа сама не так, пожалуйста, дайте мне пример кода, который может разыменовать массив указателей для получения значения, указанного элементом массива ...

Ответы [ 4 ]

6 голосов
/ 11 августа 2010

Этот код не должен компилироваться. Подпись для display должна быть int display(int **a , int *b , int *c), потому что a является указателем на int* (помните, что массивы уменьшаются до указателей). Затем вам нужно написать printf("\n%d %d",*a[0],*a[1]) для разыменования указателей в массиве.

1 голос
/ 11 августа 2010

Подпись display () указывает, что a является указателем. Теоретически это может работать в C, но gcc дал мне ошибку. Что вы хотите сказать компилятору, так это то, что вам нужен массив указателей. Я сделал это с помощью int ** a в сигнатуре функции. Код ниже показывает, как я это сделал. Кроме того, я немного исправил это, так как некоторые из ваших включений не нужны, указатели должны быть напечатаны как беззнаковые, отображение, вероятно, будет лучше, чем пустота, так как раздражение в начале строки \ n тем, что последняя строка вывода закончилась в моей строке приглашения, а getchar () здесь не имеет смысла.

#include<stdio.h>

void display(int **a , int *b , int *c)
{
  a[0] = b;
  a[1] = c;
  printf("%u %u\n", a[0], a[1]);
  printf("%d %d\n", *a[0], *a[1]);
} 

int main(void)
{
  int *a[5];
  int b,c;
  printf("Enter two integers: ");
  scanf("%d %d",&b,&c);
  printf("%d %d\n",b,c);
  display(a,&b,&c);
} 
1 голос
/ 11 августа 2010
#include <stdio.h>

int display(int** a, int* b, int* c)
{
   // store the value of b and c on array a
    a[0] = b; 
    a[1] = c;

    //print the memory addresses stored in hex format
    printf("0x%x 0x%x\n", (int)a[0], (int)a[1]);

    //print the values
    printf("%d %d\n", *a[0], *a[1]);

    return 1;
}

int main()
{
    int* a[5];
    int b,c;
    scanf("%d %d",&b,&c);
    printf("%d %d\n",b,c);
    display(a,&b,&c);
    getchar();

    return 0;
}
0 голосов
/ 11 августа 2010

Вы хотите хранить адреса (указатели) в векторе a.Определите вашу функцию, чтобы принимать вектор указателей:

int display(int *a , int *b , int *c)

Это имеет то преимущество, что компилятор компилирует код.

Или лучше: используйте имена, которые помогут вспомнить, что вы имеете в виду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...