2015-05-06 4 views
0

В моей функции main() инициализируйте указатель массива *AD и скопируйте адрес массива A[5] в указатель AD[5], используя для цикла. Когда я передаю этот указатель AD для функции row1() и присвойте все его значения (в AD) I[5] Я получаю реальные значения A[5] вместо адреса. С другой стороны, когда я печатаю значение указателя AD[5] в main(), я получаю адрес. Я использую компилятор DEV C++.Передача указателя массива функции в C

Почему в функции я получаю реальные значения?

#include <stdio.h> 
int main(void) 
{ 
    int test; 
    int A[5]; 
    int *AD[5]; 
    FILE *fpc; 
    fpc=fopen("testing.txt","r"); 
    fscanf(fpc,"%d",&test); 
    int i; 
    for(i=0;i<test;i++) 
    { 
     int j; 
     for(j=0;j<5;j++) 
     { 
      fscanf(fpc,"%d",&A[j]); 
      AD[j]=&A[j]; 
      printf("%d ",AD[j]); 

     } 
     puts(""); 

     row1(AD[0]);  
    } 
} 

void row1 (int AD[0]) 
{ 
    int I[5]; 
    int i; 
    for(i=0;i<5;i++) 
    { 
     I[i]=AD[i]; 
     AD[i]=AD[i]+1; 
     printf("%d,  ",I[i]); 
    } 
    puts(""); 
    puts(""); 
    puts(""); 
    puts(""); 
} 
+0

Непонятно, чего вы пытаетесь достичь в строке функций1. –

+0

В основном я хочу передать массив A [5] для функции row1 .. и я пытаюсь проверить, успешно ли он передан или нет, поэтому я использую printf («% d», I [i]), чтобы проверить ... Я получаю правильные значения A [5] в строке функций1, но проблема в том, что теоретически я должен получить АДРЕС А [5] в FUNCTION ROW1 .... – ibadia

+0

ПРАВИЛЬНО: 'int A [5 ]; ... fscanf (fpc, "% d", &A[j]); '; INCORRECT:' AD [j] = &A[j]'; ЛУЧШЕ: 'AD = A; k = AD [j];' ... OR ... (если вы должны) 'AD = &A[j]; k = AD [0];' – FoggyDay

ответ

2

Декларация ...

int *AD[5]; 

... объявляет AD быть массив из пяти указателей до int. Вы инициализируете каждый элемент указателем на соответствующий член A (что кажется расточительным, но что угодно).

Вы позже выполнить этот вызов:

row1(AD[0]);  

Это нормально: он проходит первый элемент AD к функции. Поскольку AD[0] является указателем на A[0], что эквивалентно либо из них:

row1(&A[0]);  
    /* or */ 
    row1(A);  

Примечание особенно последний.

Теперь функция row() объявляется следующим образом:

void row1 (int AD[0]) 

, что, как представляется, объявить параметр функции AD как массив нулевых int с, который был бы недействительным, но на самом деле, длина массива в объявлениях аргументов функции игнорируются. Это заявление равносильно либо из них:

void row1 (int AD[]) 
/* or */ 
void row1 (int *AD) 

Это согласуется с аргументом, вы передаете, но учтите, что AD функции row1() отличается от AD в main(), и они имеют разные и несовместимые тип ,

Когда в функции row1() у вас есть ...

I[i]=AD[i]; 

... вы присваиваете значение указал на указателем AD + i. То, как вы устанавливаете вещи, это работает до значения, которое может быть выражено как A[i] в main().

Если действительно вы хотите напечатать представление указателей сами, то вы могли бы сделать это в row1() так:

int i; 
for (i = 0; i < 5; i++) { 
    printf("%p,  ", AD++); 
} 

Обратите внимание, что это указатель сам печатается, не то, что он относится к. Заметим также, что это зависит от его правильности от способа, которым main() инициализирует его AD.

В качестве альтернативы, вы можете переписать row1() так:

void row1 (int *AD[]) 
{ 
    int i; 
    for(i = 0; i < 5; i++) 
    { 
     printf("%p,  ", AD[i]); 
    } 
} 

И вызвать его из main() так:

row1(AD); 

Обратите внимание, что там вы проходите весь массив, а не только один элемент , Это ваша единственная альтернатива, если вы не можете полагаться на членов main()AD, чтобы быть указателями на последовательные элементы массива.

+0

получил правильное значение .thanks – ibadia

2

Если вы хотите передать массив указателей, то объявление функции и ее вызов будет выглядеть

void row1 (int *AD[]); 

//... 

row1(AD);  

Примите во внимание, что функция должна быть объявлена ​​до ее вызова.

Что касается самой функции, тогда неясно, чего вы пытаетесь достичь в рамках функции.

Кроме того, как массив AD представляет собой массив указателей, то вы должны использовать спецификатор формата %p в функции PRINTF

printf("%p ",AD[j]); 
+0

получил правильное значение .thanks :) – ibadia

Смежные вопросы