2015-01-19 5 views
-3

Мне нужна следующая цитата, особенно жирный текст, чтобы быть оправданным.Почему указатели и массивы не одинаковы: нужно обоснование по цитатой

... Это, как правило, означает, что каким-то образом source[i] такая же, как *(p+i).

На самом деле, это правда, то есть везде, где вы пишете [i], его можно заменить на *(a + i) без каких-либо проблем.

Фактически, компилятор создаст тот же код в любом случае. Таким образом, мы видим , что арифметика указателя - это то же самое, что индексирование массива. Любой синтаксис дает результат . Это НЕ говорит, что указатели и массивы - это одно и то же, они не. Мы только заявляем, что для идентификации данного элемента массива у нас есть выбор из двух синтаксисов: с использованием индексации массива, а другой с использованием арифметики указателя, которые дают идентичные результаты .

Это цитата из PDF

Учебник по поинтеры и Массивы в C по Ted Jensen Version 1.2 (PDF-версия) сентября 2003 P.No: 19

+0

http://en.wikibooks.org/wiki/C_Programming/Pointers_and_arrays –

ответ

0

Указатели и названия массивов разные

Да.

Рассмотрим следующий фрагмент кода, чтобы получить разницу

int a[3]; 

int *p = a; 

a++; /* This is a error */ 
p++; 

printf("%d\n",*p); 

имя массива не может быть изменяемым именующее. (В соответствии со стандартом)

Где как указатель возможно.

Добавление другой пример, где вы можете увидеть разницу

printf("%d\n",sizeof(a)/sizeof(*a)); 
printf("%d\n",sizeof(p)/sizeof(*p)); 

Количество элементов в массиве может быть дано в первой строке, а не второй. Зачем? Array name and Pointers are different

+0

Если имя массива является указателем константы, как утверждают другие, будет ли это означать, что массивы и константные указатели являются одинаковыми по-прежнему массивами, а указатели не одинаковы? – nmxprime

+1

'Если имя массива является постоянным указателем, я не понимаю? Имя и указатель массива разные.Массив распадается на указатель, и, следовательно, указатель-указатель может использоваться для доступа к элементу – Gopi

+0

'Если имя массива является константным указателем', мы обычно говорим, что имя массива является указателем const – nmxprime

1

Array типа T может вести себя аналогично указателю типа T, но их типы разные, и этот компилятор рассматривает их как разные типы.


Давайте рассмотрим некоторые прагматические примеры.

Пример 1, где вы можете увидеть разницу.

int a[1200] = {0}; 
int *p = a; 
assert(sizeof a != sizeof p); 

Пример 2 где вы можете увидеть разницу.

/* test.c */ 
#include<stdio.h> 
#include"head.h" 
struct token id_tokens[10]; 
int main() 
{ 
    printf("In original file: %p",id_tokens); 
    testing(); 
} 

/* head.h */ 
struct token { 
    int temp; 
}; 

/* test1.c with v1 */ 
#include<stdio.h> 
#include"head.h" 
extern struct token* id_tokens; 
void testing() { 
    printf("In other file %p",id_tokens); 
} 

/* test1.c with v2 */ 
#include<stdio.h> 
#include"head.h" 
extern struct token id_tokens[]; 
void testing() { 
    printf("In other file %p",id_tokens); 
} 

Вывод с v1: Выход: В исходном файле: 0x601040In другой файл (ноль)
Вывод с v2: Выход: В исходном файле: 0x601040In другой файл 0x601040

Пример 2 выбрал из extern declaration, T* v/s T[]


Дальнейшие показания на массив и указатель: C-faq

+1

Другой пример: 'int array [5]; array [3] = 42; 'отлично,' int * array; array [3] = 42; 'нет. – immibis

1

Массив - это блок последовательных элементов, каждый из которых имеет один и тот же тип. Например, блок из 200 целых чисел.

Указатель - это небольшой объект, который может идентифицировать местоположение памяти.

Это ничего не значит друг друга. Массив может иметь размер гигабайта, но указатель не более 8 байтов (в популярных системах).

Говоря «массивы и указатели одинаковые» или «массив является постоянным указателем» или другой такой мусор, имеет такое же значение, как и утверждение, что дом представляет собой конверт.


Все, что не имеет ничего общего с разговором о a[n] против *(a + n). Это особенность синтаксиса языка, который является другой темой для компоновки переменных в памяти.

Мы можем запретить использование [] вне деклараторов, а C все равно будет иметь одинаковую функциональность, но код будет сложнее читать. Правила языка говорят, что вы можете написать a[n] как более читаемую версию *(a + n); и они имеют тот же эффект.

2

a[i] и *(a + i) такие же по определению. Стандарты C и C++ определяют синтаксис a[i], который всегда эквивалентен *(a + i), до момента, когда a[i] и i[a] являются взаимозаменяемыми.

Это не говорит вам ничего об отношениях между указателями и массивами, потому что, технически, как в a[i] и *(a + i), a является выражением указателя типа. Оператор [] принимает выражение указателя слева, а не выражение массива; и оператор + работает только с указателем и целым числом, а не с массивом и целым числом.

То, что вы можете использовать массив вместо a, является просто результатом того, что выражение типа массива может быть неявно преобразовано в выражение rvalue типа указателя.

+0

Хорошо сказано :) ... – nmxprime

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