2016-03-27 5 views
1

Я смущен, почему я могу создать строку, используя только char *. Не является ли char * просто указателем на один символ? Что заставляет меня внезапно позволить рассматривать эту вещь как нитку? Могу ли я сделать это с другими объектами? О нас:Почему char * создает строку?

int* arr; 

У меня теперь есть массив ints? Это динамически размер? Могу ли я только позвонить по телефону

arr[0] and arr[1] 

и ожидать, что он сработает?

Я уже давно ищу работу в Интернете и не могу найти четкого ответа на этот вопрос. Это одна из частей C, которую я всегда принимал как способ ее работы ... не более того.

+0

Вам нужно прочитать хорошую книгу (а не google). Чтобы различать char * и char массивы, прочитайте [этот ответ] (http://stackoverflow.com/questions/15177420/what-does-sizeofarray-return/15177499#15177499) - прочитайте вторую часть ответа –

+0

«Не является a 'char *' просто указатель на один символ? " Нет, необязательно, это указатель на ** ** символ. Он ничего не говорит о том, есть ли другие символы (или то, что интерпретируется как символ) поблизости. –

+0

См. Http://www.c-faq.com/aryptr/index.html. В частности: http://www.c-faq.com/aryptr/aryptrequiv.html – jamesdlin

ответ

1

Не является ли char * просто указателем на один символ?

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

Что заставляет меня внезапно позволить рассматривать эту штуку как строку?

Когда указатель char * указывает на место памяти, где несколько символов [] распределяются один за другим (массив), вы можете получить к ним доступ с индексом массива [idx]. Но вы должны либо:

A. Используйте статически выделяемый массив в коде:

char myArray[5]; 

Б. или динамического выделения (таНос() в языке C):

int chars_in_my_array = 10; 
char* myArray = (char*)malloc(sizeof(char) * chars_in_my_array); 

Могу ли я сделать это с другими объектами? Как насчет: int * arr; У меня теперь есть массив ints?

нет, вы не:

int* p;   //'p' is a *pointer* to an int 
int arr[10]; //'arr' is an array of 10 integers in memory. 

Вы можете установить 'р', чтобы указать на первый элемент в 'обр', делая это:

p = &arr[0]; //'p' points to the address of the first item in arr[] 

Является ли это динамически размер?

Нет. Это то, что вы увидите в конструкции более высокого уровня, такой как «std :: string» в C++ или «String» на Java. В C память управляется вручную (или вы используете существующие библиотечные функции для этого, см. Стандартный заголовочный файл 'string.h')

Могу ли я начать называть arr [0] и arr [1 ] и ожидать, что он будет работать?

Нет, если вы сделаете это:

int arr[5]; 
arr[0] = 100; arr[1] = 200; 

... Потому что вы статически выделить массив из пяти целых чисел. Затем вы можете получить к ним доступ с индексом массива.

Однако вы не можете сделать это:

int* p; 
p[0] = 100; p[1] = 200; // NO!! 

Поскольку «р» это просто переменная, которая содержит адрес памяти в виде целого числа. Он фактически не выделяет никакой памяти, если вы явно не выделяете для нее память. Вы можете сделать это, хотя:

int* p; 
int arr[10]; 
p = &arr[0]; 
p[0] = 100; p[1] = 200; // This is OK 

Это работает, потому что «р» теперь указывает на память, которая была (статически), выделенной для массива. Таким образом, мы можем получить доступ к массиву через указатель «p».

Вы можете также динамически выделять массив:

int* p; 
p = (int*)malloc(sizeof(int) * 10); 
if(p != NULL) { 
    p[0] = 100; 
    p[1] = 200; 
} 

Здесь мы выделяем память для 10 целых чисел и «р» указывает на первый элемент. Теперь мы можем использовать 'p' как массив. Но только для 10 предметов максимум!

Я уже давно ищу работу в Интернете и не могу найти какой-либо ясный ответ . Это одна часть C. Я всегда только принят как способ работы ... не более.

Действительно? Попробуйте массивы «googling» в c ',' распределение памяти в C ',' static vs dynamic allocation C 'и такие функции, как malloc() и free(). Существует множество информации, но надеюсь, что это поможет стартерам :)

1

Указатели указывают на вещи. int *arr; в настоящее время не указывает нигде. Вы не можете рассматривать это как указание на что-либо (массив или иначе).

Вы можете указать ему что-нибудь. Если вы укажете его на один int, вы можете рассматривать его как указание на один int. Если вы укажете его на элемент массива из int, вы можете рассматривать его как указывающий на элемент массива.

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

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