2014-12-12 8 views
-2
#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    int *p, n, i; 
    printf("Enter the size of the array:"); 
    scanf("%d", &n); 
    p = (int *)malloc(n * sizeof(int)); 
    for (i = 0; i < n; i++) 
    { 
     printf("\n Enter element %d:", i + 1); 
     scanf("%d", &p[i]); 
    } 
    for (i = 0; i < n; i++) 
     printf("\n %d", p[i]); 
    return 0; 
} 

Зачем нам нужно писать & в scanf, если это массив, в этом нет необходимости? p - указатель на все области памяти, поэтому &p[i] должен указывать адрес указателя, но не там, где мы хотим сохранить данные правильно? Также, если мы напишем *p[i] в printf, он дает ошибку, p - это указатель, поэтому мы должны уважать его и хранить данные в зарезервированном пространстве в памяти, но он не работает? Даже если я скомпилирую вышеуказанную программу, так как она перестает работать после ввода 3 значений в качестве входных данных.Распределение памяти C (malloc)

+1

[Не выдавать результат malloc] (http://stackoverflow.com/q/605845/296974). – glglgl

+0

Каков точный ввод, который вы даете программе? Каковы точные результаты, которые вы получаете? –

+0

«' p' - это указатель, поэтому мы должны его уважать ». Мы делаем это, используя' p [i] ', который является таким же, как' * (p + i) '. – glglgl

ответ

2

Оператор индексирования [] также выполняет разыменование. Он выполняет индексирование и разыменование сразу. p[n] эквивалентен *(p+n), то есть он переходит на смещение и разыгрывает его. Следовательно, &p[n] эквивалентен p+n.

+0

Это оператор нижнего индекса, а не оператор разыменования. (Нет ничего, что называется «оператором разыменования», хотя унарный * оператор * делает * разыменовывает указатель.) –

+0

Спасибо за официальный срок. Я сделал небольшое изменение, чтобы избежать недоразумений. –

+0

@Peter Schneider Если p [n] эквивалентно * (p + n), то почему он показывает ошибку, если мы пишем * p [i]. И что означает u, означающее & p [n], эквивалентно p + n? – Rooney10

2

Если значение p[i]

p[i] = *(p+i) 

Тогда место должно быть

&p[i] 

Таким образом, вы должны указать, что это место, куда вам нужно сохранить это значение и будет &p[i]

или (p+i)

&p[i] = (p+i) 
+1

не перекомплементивайте вещи: '& p [i] == & * (p + i) == (p + i)' – BeyelerStudios

+0

@BeyelerStudios Я поместил это по-другому! Я думаю, здесь нет ничего сложного – Gopi

+0

вы только что добавили ошибку: '& (p + i)' не то же самое, что '(p + i)' – BeyelerStudios

0

Вам необходимо написать &n, чтобы сообщить scanf, куда поместить данные. & - это адресный оператор, он возвращает адрес памяти, в котором хранится переменная.

&p[i] предоставит адрес i-го элемента массива.

+1

Это не ссылочный оператор. В C. В C нет ссылок. Он также не называется ссылочным оператором в C++. –

1

Почему мы должны написать & в зсапЕ, если это массив это не надо?

Массивы распадаются на указатель первого элемента. Обычно выражение a, где a представляет собой массив, превращается в &a[0].

Кроме того, если мы пишем * р [я] в Printf, он дает ошибку, р является указателем так мы должны почтительным его и хранить данные в зарезервированном пространстве в памяти , но это не работает?

Нет, вы пытаетесь применить унарный оператор к тому, что не является типом указателя. Выражение формы E1[E2] эквивалентно (*((E1)+(E2))), поэтому, если все, что дается *, не является типом указателя, то синтаксис недействителен.

+0

1. P - указатель на массив, поэтому & p должен отображать адрес указателя, а не адрес памяти элемента? 2.Say int * p = & a; a = 5; * p = 8 printf ("% d", * p); Он должен напечатать 8 справа, но 8 не является указателем, но он все еще показывает правильный ответ? – Rooney10

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