Какая разница в заявлении этих указателей - PullRequest
1 голос
/ 31 марта 2020
int main(){
  char *c = "testando"; // how i can declare an array of characters at the same time of a char pointer statement
  int *i = {1,3,5,7,9}; // and here i can't declare an array of integers at the same time of a integer pointer statement
  return 0;
}

В чем разница?

Ответы [ 3 ]

2 голосов
/ 31 марта 2020

Это просто синтаксис. Строковые литералы, такие как "hello", дают массив только для чтения char[] как специальный тип. Точно так же строковый литерал может использоваться как инициализатор массива.

{1,3,5,7,9} - это не массив, а список инициализаторов.

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

int *i = (int[]){1,3,5,7,9};

Это в значительной степени эквивалентно объявлению именованного массива с указанием на него:

int arr[] = {1,3,5,7,9};
int *i = arr;
2 голосов
/ 31 марта 2020

Инициализация указателей на строки была особым случаем на оригинальном языке C.

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

int *i = (int[]){1, 3, 5, 7, 9};
0 голосов
/ 31 марта 2020

В первом случае c - указатель на строковую константу . Это , а не , то же самое, что указатель на массив .

c - указатель на список символов, оканчивающийся нулевым символом в только для чтения памяти. Указатель можно переназначить так, чтобы он указывал на другой символ или строку символов.

Это полезно по нескольким причинам и поэтому включено в стандарты ANSI и GNU C. Наличие указателя на список целых чисел в постоянном запоминающем устройстве не так полезно, как перечисления или preprocesser # define вызовы, как правило, лучше.

Он не будет вести себя как массив, изменяющий значение символов, не определено - попробуйте вызвать: *c = 2 или *(c+1) = 4.

Ниже приведен пример того, как функция может использовать строковую константу:

File *openPipeToProgram(int flag){
        char *programname;
        if(flag == PROGRAM1)
                programname = "program1"
        else if(flag == PROGRAM2)
                programname = "program2"
        else
                return NULL;
        return popen(programname, "w");
}

Обратите внимание, что PROGRAM1 и PROGRAM2 являются символическими c константами, которые используются вместо числовых массивов только для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...