2016-03-12 2 views
6

Как может char указатель быть инициализирован строкой (массив символов), но указатель int не с целым числом?Как инициализировать указатель char со строкой (массив символов), но указатель int не с целым числом?

Когда я попробовал этот

int* a={1,2,3,4,5}; 

Это дает ошибку говоря

error: scalar object ‘a’ requires one element in initializer

Но,

char* name="mikhil" 

работает отлично.

+1

Вы можете сделать это: int a [] = {1,2,3,4,5}; – kvr

+2

_ "Но char *' name = "mikhil" 'отлично работает" _ Нет, это не так - это неправильно в C++ и ** не будет компилировать **. Итак, мы говорим о C или C++? – edmz

ответ

7

В случае, если вы пытаетесь инициализировать int * с

{1,2,3,4,5}; 

это неправильно, потому что {1,2,3,4,5};, как есть, не является массив целых. Это скопированный список инициализатора. Это можно использовать для инициализации массива int (отдельные элементы массива, если быть конкретным), но не указатель. Массив не является указателем и наоборот.

Однако, вы можете сделать использование compound literal для инициализации int *, как

int * a = (int []){1,2,3,4,5}; 
+1

Не работает ли это только на C, а не на C++ –

+1

@KentKostelac Это расширение gcc (и clang?) В C++, поэтому оно не является стандартным. Похоже, что он оставляет свисающий указатель. –

+0

ваш предложенный метод дает ошибку «получение адреса временного массива» –

9

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

char* name={'m', 'i', 'k', 'h', 'i', 'l', 0}; 

Буквальной строка получает свою собственную обработку и не определяется как массив символов.

+0

Вы правы, но это не означает этот конкретный вопрос. Здесь принципиальная разница в использовании инициализатора. –

2

Для удобства, язык позволяет символ * (или, предпочтительно, Const символ *) для инициализации со строкой , Это потому, что это очень распространенное использование, и это было возможно с C. Вы не должны действительно изменять строковое значение (разумеется, это отдельная дискуссия).

С int, если вы инициализируете int [5], ожидается, что вы можете изменить значения. Инициализированные значения будут скопированы в ваш массив (оптимизация компилятора не выполняется), и вы можете изменить их, как вы сочтете нужным. Если бы int * a было разрешено инициализировать этот путь, на что это указывает? Это не совсем понятно, поэтому стандарт не позволяет этого.

1

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

это та же причина, по которой

cout<<anystring; дать полный спектр характера т.е. полной строки и этот Донта

cout<<a; для Int массива в 1-й и ... Infact он выдает сообщение об ошибке и DonT печатает полный 1-D массив ...

upvote, если я где-то удовлетворен/решил ваш запрос ...

+0

'' \ 0'' - это просто символ со значением '0', который можно повысить до' int'. В стороне, я не вижу, как к ней применяются нулевые терминаторы. Проблема в том, что '{1, 2, 3}' не является массивом. –

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