2012-03-16 6 views
1

При написании int * x существует ли неявный int для типа указателя, так что неявно это int * int x?Является ли int * x эквивалентным int * int x?

+3

Указатель не является int ... – sidyll

+11

'int * int x' означает абсолютно ничего. – Benoit

+0

related: http://stackoverflow.com/questions/502811/sizeof-int-sizeof-void – Benoit

ответ

2

Чтобы развернуть на моем ealier комментарий ...

Там нет ни одного типа данных указателя в C. Вместо этого у вас есть несколько «указатель на T» типов данных - int * является отдельным типом данных из char *, который представляет собой особый тип данных из double *, который является особый тип данных из void (*)(...), который представляет собой особый тип данных из long (*)[N] и т.д.

Даже если все типы указателей имеют одинаковый размер и представление (что в случае на большинстве платформ, но не гарантировано), семантика будет отличаться. Предположим, что заявления

int *ip = (int *) 0x00004000; 
char *cp = (char *) 0x00004000; 

Оба ip и cp начать с тем же значением (указывая на адрес 0x00004000, который, вероятно, не действует). Если я выполнять операторы

ip++; // or ip = ip + 1; 
cp++; // or cp = cp + 1; 

результирующие значения ip и cp будет отличаться; ip будет содержать адрес следующего целого числа (либо 0x00004002 для 16-разрядного целого числа или 0x00004004 для 32-разрядного целого числа), но cp будет содержать адрес следующего символа (0x00004001). Арифметика указателя зависит от базового типа указателя, поэтому операции с целыми указателями будут давать разные результаты от операций над указателями на другие типы.

Возможно, что разные типы указателей имеют разные размеры. Подумайте о архитектуре с обращением к словам, где базовая единица памяти может быть 16 бит в ширину или 24, или 32 или 36. Любой указатель на тип, который занял полное слово, будет иметь N бит шириной, но для типов char * потребуется некоторые дополнительные биты указывают на определенные символы внутри слова (если вы не решили, что значения char также должны занимать полное слово).

1

int * x объявляет x как переменную типа «указатель на объекты типа int».

+0

Но каков тип * указателя *? 'int', правильно? – Randomblue

+6

Почему у меня внезапно появилось воспоминание «Кто на первом месте?». –

+0

@Randomblue: указатель не является 'int'. Арифметика указателя отличается от арифметики 'int' (' p + 1' ≠ 'i + 1') и т. Д. Указатели являются типами сами по себе. Если вам интересно, сколько байтов они хранятся, тогда используйте 'sizeof x'. Возможно, вы получаете то же самое, что и 'sizeof int', но это не гарантировано. – Benoit

1

№ Указатели не обязательно имеют тот же размер, что и int. Это особенно актуально для некоторых архитектур, и если вы также принимаете во внимание такие вещи, как указатели на функции.

+0

Ага. Итак, каков тип указателя? – Randomblue

+2

Тип указателя - тип указателя. –

+0

@CarlNorum: Ага. И обозначение '*' для типов указателей? Спасибо, мне кажется, я понял это сейчас. – Randomblue

1

Нет никакого неявного ничего при написании int *x. x - указатель, но он не указывает ни на что. Тип x: int *.

int * int x не является юридическим синтаксисом вообще.

+0

это довольно болтается. Он * может * указать на что-то действительное, если вам действительно повезло. – Benoit

+0

Да, но даже тогда, полагаясь на неопределенное поведение, возможно, плохая идея. –

+0

Кто сказал обратное? – Benoit

3

Указатель is a тип. Это не целое число, это не поплавок, это не двойной, это не символ, это не долго. То, что он поддерживает, зависит от архитектуры машины, для которой вы скомпилировали свой код.

Когда вы делаете арифметику на указателях (+=, -=), результат не совпадает с результатом, когда вы делаете это с целыми числами.

Вы также заметите, что char * и int * - это различные типы. Вы можете, вероятно, бросить между ними, но когда вы увеличиваете их, если только sizeof int == 1 вы не получите другого результата.

Что вы, вероятно, хотите знать, это какой размер занимает указатель. Попробуйте тогда следующее:

printf("%u %u %u %u\n", sizeof(char), sizeof(int), sizeof(int *), sizeof(long)); 

Обратите внимание, что различные типы указателей can have различных размеров.

+0

Не могли бы вы сделать 'sizeof (*)' или что-то подобное, вместо 'sizeof (int *)'? [Потому что 'int' в' sizeof (int *) 'является избыточным/бесполезным.] – Randomblue

+0

@ Randomblue: no. Вы можете 'typedef int * int_ptr' и использовать' sizeof (int_ptr) '. – Benoit

+1

@ Randomblue: int is * not * избыточно или бесполезно; указатели на int могут быть разных размеров от указателей до других типов. Не существует единого типа «указатель»; существует несколько типов «указатель на Т». –

0

Что-то, что имеет тенденцию смущать при обучении C, является символом *. Это на самом деле имеет два совершенно различных применений:

  1. Чтобы создать указатель переменной
  2. Используется как Косвенность оператора

Вы можете получить адрес (адрес памяти) в указатель переменную и назначить ее переменной указателя, используя Адрес&.

// Using * to create a Pointer Variable (pointer to an int): 
int * intPtr; 

// Using the & Address-of Operator to get the Pointer Address (memory address) of a variable, and assign it to a Pointer Variable: 
int x = 10; 
intPtr = &x; 

// Printing the value of `x`, which is 10: 
printf("%d\n", x); 

// Using the Indirection Operator *, on a Pointer Variable, to perform indirection: 
*intPtr = 20; 

// Above, we modified the value of `x` using indirection via `intPtr`. So now `x` is equal to 20, and not 10: 
printf("%d\n", x); 

Е() Выход:

10 
20 

Как уже упоминалось другие, int * int x; не действует в С.