Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 15.02.2020
Сообщений: 11
1

Что такое char *a[2], и в чем его отличие от char *a?

15.02.2020, 13:45. Просмотров 407. Ответов 3
Метки нет (Все метки)

Предположу, что char *a - указатель на символьный элемент(адрес), а char *a[2] - массив указателей на указатели на символьные переменные(адреса адресов). В частности, если
C
1
2
char *a;
char *b[2];
,то a - адрес некоторого символьного элемента, a + 1 - адрес элемента в памяти, который в памяти расположен после символьного элемента с адресом a и т.д, а
b - адрес адреса некоторого символьного элемента, b + 1 - адрес следующего адреса другого символьного элемента...
Поэтому запись
C
1
char *a = "Hello";
означает, что по адресу a записывается символьный элемент 'H', в адрес a+1 записывается символьный элемент 'e', ..., по адресу a+5 записывается элемент $\0$(верен ли порядок действий?).
Запись
C
1
char *b[2] = {"Hello", "Hi"};
означает следующее:
1) Создаются адреса b, b + 1 адресов символьных элементов. b[0] и b[1] означает данные, которые лежат в адресах b, b+1, а в последних, как мы знаем, лежат адреса символьных элементов. Значит b[0] - адрес одного символьного элемента, b[1] - другого. Я так понял запись квадратный скобок есть аналог разыменования указателя, то есть мы "разыменовываем" b, b+1, обращаясь данным b[0], b[1] , которые лежат по этим адресам.
2) Для адресов символов b[0], b[1] повторяется алгоритм, разобранный выше.

Кстати, допустим
C
1
2
3
4
5
6
#include <stdio.h>
 
int main(){
    char *b[2] = {"Hello", "Hi"};
    printf("%s %c", b[0] ,b[1]+1);
}
Программа выводит : Hello K
То, что программа вывела строку "Hello" с пробелом понятно - b[0] - указатель на символьный элемент, отождествляемый со строкой, начало которой имеет адрес b[0] совпадающий с адресом первого символа строки. Но почему далее программа вывела символ 'K'? По идее, b[1]+1 - адрес символа 'i', поэтому, учитывая спецификатор с, должен был быть выведен символ 'i'.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2020, 13:45
Ответы с готовыми решениями:

Чем char отличается от unsigned char?
я наверно тупая,но понять этого не могу.помогите,пожалуйста спасибо

В чем отличие char* s от char *s
В чем отличие char* str; от char *str; ?

В чем отличие двумерного массива типа char от массива указателей на char?
В чем отличие двумерного массива типа char и массива указателей на char ?

Строка: чем отличается строки string, char, char*?
Помогите разобраться,совсем плохо идёт,чем отличается строки string,char,char* И если можно пару...

3
1118 / 931 / 429
Регистрация: 25.12.2016
Сообщений: 3,030
15.02.2020, 13:53 2
Цитата Сообщение от Rusit8800 Посмотреть сообщение
поэтому, учитывая спецификатор с, должен был быть выведен символ 'i'.
Нет. Должен быть выведен адрес символа 'i'. Точнее, адрес, приведённый к типу char.
Чтобы вывести сам символ, адрес нужно разименовать:
C
1
printf("%s %c", b[0] ,*(b[1]+1));
Добавлено через 1 минуту
Или то же самое можно записать по-другому:
C
1
printf("%s %c", b[0] ,b[1][1]);
0
0 / 0 / 0
Регистрация: 15.02.2020
Сообщений: 11
15.02.2020, 14:22  [ТС] 3
Должен быть выведен адрес символа 'i'. Точнее, адрес, приведённый к типу char.
То есть в моем случае фактически произошло следующее:
1) Берется численное двоичное значение адреса b[1] + 1 (то есть сам этот адрес, так как адреса хранятся в двоичном коде).
2) Его в двоичном виде нужно "обрезать", чтобы уместить в 8 бит.
3) Последовательности из полученных 8 упорядоченных нулей и единиц ставится символ в соответствии с таблицей ANSI.

Далее рассмотрим двоичный код самого символьного элемента *(b[1]+1)=b[1][1]. Чтобы определить этот элемент, нужно посмотреть на адрес b[1]+1, и по этому адресу увидеть двоичное представление символьного элемента, расположенного по этому адресу. Двоичный код (char) (b[1]+1) не обязан совпадать с двоичным кодом символа b[1][1],так как мы можем сами фиксировать символ b[1][1], а его адрес компьютер произвольно фиксирует сам, следовательно и значение (char) (b[1]+1), зависящее от b[1]+1 произвольно, и зависит от прихотей компьютера.
0
1118 / 931 / 429
Регистрация: 25.12.2016
Сообщений: 3,030
15.02.2020, 15:06 4
Rusit8800, всё так.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.02.2020, 15:06

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

выдает ошибку :[C++ Error] Unit1.cpp(30): E2034 Cannot convert 'char' to 'char *' не понимаю в чем дело
//Дано предложение. Найти наибольшее количество идущих подряд пробелов #include &lt;vcl.h&gt;...

Что такое char**
int main(int argc, char** argv) Что значит именно ** using namespace std; string stroka; ...

Что такое char* ?
char* szString = &quot;Randy&quot;; Объясните, чем в данном случае является szString? Если это...

Чем отличается const char* от char*?
Доброго всем дня! Из матчасти я понимаю, что char* - это указатель массив символов, тогда как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.