parveenkumar007 Ответов: 5

Разница между C &C++


1)в чем разница между char *STR="hello"; и char arr[]="hello";

2 )в чем разница между структурой c++ и структурой c??? :)

xenotron

И STR, и arr выделяют массив символов в глобальной области памяти или в стеке, содержащем символы в стеке. Разница:
1. arr: arr-это идентификатор, значение которого является константой, для самого значения arr не выделена переменная. Когда вы используете arr в своем коде, компилятор "жестко кодирует" эту константу. (Под капотом это не обязательно константа, когда машинный код генерируется для смещения независимого материала и когда расположение массива является относительной областью памяти стека, но это проблема генератора кода, с вашей точки зрения (с точки зрения пользователя языка) arr-это постоянное значение без выделенной переменной/хранилища.)
- STR: в случае этого объявления помимо массива символов компилятор также выделяет для вас переменную char* и инициализирует ее для вас по адресу массива символов (к постоянному значению, которое является тем же значением, к которому вы обращаетесь с символом arr в предыдущем примере). Очень большая разница по сравнению с arr заключается в том, что STR здесь сама по себе является переменной-указателем, которую вы можете изменить позже в своем коде, вы не можете сделать этого с константой arr.

Еще одно очень большое различие: тип символов STR и arr. Тип STR - char*, а тип arr-char[]. Разница часто невидима, потому что компиляторы C/C++ содержат очень уродливый Хак (на мой взгляд): идентификаторы массивов (arr) во многих случаях автоматически преобразуются в указатели. Например, если вы говорите char* myvariable = arr; то компилятор автоматически преобразует тип arr в указатель, указывающий на arr.

оператор sizeof тоже есть сюрпризы: оператор sizeof(STR), который совпадает с размером sizeof(Void*) в качестве STR-это указатель переменной и sizeof(Арр) даст вам размер символьного массива, а arr-это массив символов. Однако если вы объявите функцию типа:
void myfunc(char array_param[])
{
}
тогда sizeof(array_param) - это sizeof(void*), поскольку параметры массива на самом деле являются указателями, параметры массива никогда не передаются по значению, даже если вы указываете точный размер параметра массива!!! Вы можете принудительно установить фиксированный размер для входящего параметра массива с помощью ключевого слова static (я никогда не использовал его, просто видел в странном примере...)

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

5 Ответов

Рейтинг:
40

CPallini

1) STR это указатель на символ(ы), инициализированный постоянной последовательностью символов {'h','e','l','l','o', \0'} вы можете, например, в следующих утверждениях вашей программы изменить ее значение:

char c='a'; STR = &c;

С другой стороны, arr это массив символов, инициализированный одной и той же постоянной последовательностью символов.
STR и arr похожи и часто взаимозаменяемы, во всяком случае есть различия, например,
sizeof(STR) != sizeof(arr).

2) в C структуры - это (мощное) средство для группировки данные, то есть они содержат только переменные-члены. С другой стороны, C++ структуры - это полностью квалифицированные классы (имеющие элементы данных и методы - конструктор и деструктор включенный -).
Разница между А class и struct в C++ язык - это просто уровень видимости по умолчанию (по умолчанию члены public в структурах пока они есть private на классы).
:)


Richard MacCutchan

Хороший четкий ответ. +5

CPallini

- Спасибо, Ричард.
Я был молод и искусен, когда писал ее.

Albert Holguin

отличный ответ! мои 5

Stefan_Lang

Выпейте еще 5. * thunbsup*

CPallini

Танк вам, неожиданный (но приветствуемый) на довольно старый ответ. :-)

Stefan_Lang

:до:
Даже не заметил, сколько ему было лет. Кто-то снова омертвляет нити...

Теперь я понимаю, что вы имели в виду, когда сказали "я был молод и искусен" в комментарии выше :D

Usman Hunjra

Красиво .. +5

CPallini

Спасибо :-)

xenotron

+5

Рейтинг:
34

Anu Koshy

Сначала поищите, прежде чем задавать вопрос. Есть доступные ответы. :)
Что касается первого, взгляните на http://c-faq.com/decl/strlitinit.html[^]
второй: http://www.geekinterview.com/question_details/37280#8[^]


Alain Rist

Отредактированная вторая ссылка указывает на правильный ответ.

Рейтинг:
2

Member 12900542

1] в случае указателя, поскольку Hello имеет 5 слов, таким образом, для его хранения используется 5 байт памяти .
и каждый байт будет иметь свой собственный адрес памяти , каждый из которых будет увеличен на единицу от предыдущего .Здесь * str - это указатель к символу, который будет указывать на " H " привета . Другими словами, *str содержит адрес 'H'. Важно отметить, что str-это указатель, и он может указывать только на один адрес одновременно, и поэтому он указывает на "H", а не на Hello .

тогда как arr [] - это массив . это похоже на имя, предоставляемое символам как a[0] = 'H', a[1]=e и так далее ..

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


2] C Структура :-
1. могут быть объявлены только переменные различных типов данных, функции не допускаются

2. возможен прямой доступ к членам данных

3. ‘структура’ тип данных не рассматривается как встроенный тип – использование структуры’ надо декларировать

объекты

4. Переменные не могут быть инициализированы внутри структуры.
тег структуры
{
1 декларации членов ;
2 декларации членов ;
...
...
декларация члена м;
};
Структура C++ :-
1. в C++ structure declaration функции также могут быть объявлены

2. Члены, объявленные в C++ структура является публичной по умолчанию

3. При объявлении объекта ключевое слово ‘структура’ опущен в C++


Richard MacCutchan

Пожалуйста, не публикуйте мертвые вопросы, особенно те, на которые уже есть полные ответы.

Рейтинг:
1

TerrySong

Q1: вы знаете, что STR-это указатель, arr [] - массив,но они имеют одинаковое использование :)
Q2: структуру C++ можно рассматривать как расширение структуры C


Piccadilly Yum Yum

я согласен

Stefan_Lang

А1-ложь. Можно переназначить указатель на другой адрес, но нельзя переназначить переменную массива. Кроме того, вы можете определить размер массива переменной массива, но это невозможно для указателя.

А2 довольно расплывчат и не отвечает на этот вопрос. Для справки, решение 3 предлагает гораздо более краткий и правильный ответ.

Рейтинг:
0

hakz.code

1)в чем разница между char *STR= "hello"; и char arr []= " hello";
- > Первый-это указатель на массив символов, который вы можете увеличить, чтобы указать на следующий символ, где, как и в массиве, вы не можете увеличить базовый указатель.
- > Sizeof str будет равен 4,так как это указатель в 32-битном компиляторе, но для arr он будет равен 5.


2 )в чем разница между структурой c++ и структурой c??? Улыбка | :)
-> В C при объявлении переменной типа struct ключевое слово struct обязательно должно быть передано,в отличие от C++.
- >структуры C++ могут иметь функции-члены, я думаю, что C этого не поддерживает.


Da Bai Cai

Sizeof str будет равен 4, так как это указатель в 32-битном компиляторе,но для arr он будет равен 5.
ответ неверен, sizeof (arr)=6, включая '\0'

hakz.code

Спасибо за исправление, приятель, я забыл нулевой символ..!

Usman Hunjra

умный.. :)