2014-12-10 2 views
0

Предположим, массив int a[10].массивы и указатели арифметические

Почему мы не можем сделать a=a+1? но то же самое верно с переменной указателя.

int *ptr = a; 

ptr = a+1; 

Как наблюдаются оба сценария?

+0

мы не можем изменить местоположение в памяти 'а' массив. Однако мы можем изменить внешний указатель на этот массив, чтобы указать на второй элемент массива – user3629249

+1

Потому что массив и указатели разные. –

ответ

2

Поскольку местоположения массива постоянны.

Вы не можете изменить значение a, так как это означает начальный адрес массива. Перемещение его не имеет никакого смысла.

С int *ptr; ваша переменная ptr - это всего лишь один указатель и, конечно же, может быть настроен так, чтобы указывать на любое место.

Здесь нет никаких противоречий. Это немного похоже на функции, имя функции оценивается по его адресу (называемому «указателем на функцию»), но вы также не можете назначить это.

-2

Вы можете , если массив является аргументом функции

#include <stdio.h> 

int rval(int a[10]) { 
    a = a + 1; 
    return a[0]; 
    } 

int main(){ 
    int a[10] = {0,1,2,3,4,5,6,7,8,9}; 
    printf ("%d\n", rval(a)); 
    return 0; 
} 

выход программы

1 
+1

, конечно, аргумент функции НЕ является массивом, а скорее копией указателя на массив. копия указателя может быть изменена, но не фактическое местоположение начала массива в памяти – user3629249

+0

Согласовано, но оно отвечает на вопрос, как было задано. –

+0

Привет, Но когда мы передаем массив функции, он автоматически преобразуется в указатель. Это будет тонким. Правильно? – alisha

-1

Поскольку имя массива является постоянным указатель, указывающий на его первой element.You не может изменить значение постоянной переменные, i, e, для которых используется ключевое слово const.

int a[10];  //here a (array variable is Const i,e you Cannot a=a+1) 
int* const p=&a[0]; //here Also Same,Now p is Const i,e you Cannot p=p+1. 

Но здесь:

int* pp=&a[0];//Here pp=pp+1 will work, Because pp is not Const. 
+1

«Array name is constant pointer» - нет, это массив. Тот факт, что он не может измениться, не означает, что он 'const'. –

+0

Внутренне он действует как постоянный, Он должен быть Потому что он всегда должен представлять Базовый адрес своего первого элемента. Довольно уверен в этом. –

+1

Я вижу, что вы в этом уверены, но вы все еще неправы. Все, что я говорю, это не указатель 'const'. Указатель 'const' будет выглядеть как' int * const p; '. Массив - это массив и не является указателем. Его нельзя изменить, но ** не **, потому что это 'const', а потому что это массив. Ни 'const', ни массив не могут быть изменены, но ** это не означает, что что-то, что нельзя изменить, является' const'. ** –

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