Не является ли 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(). Существует множество информации, но надеюсь, что это поможет стартерам :)
Вам нужно прочитать хорошую книгу (а не google). Чтобы различать char * и char массивы, прочитайте [этот ответ] (http://stackoverflow.com/questions/15177420/what-does-sizeofarray-return/15177499#15177499) - прочитайте вторую часть ответа –
«Не является a 'char *' просто указатель на один символ? " Нет, необязательно, это указатель на ** ** символ. Он ничего не говорит о том, есть ли другие символы (или то, что интерпретируется как символ) поблизости. –
См. Http://www.c-faq.com/aryptr/index.html. В частности: http://www.c-faq.com/aryptr/aryptrequiv.html – jamesdlin