Форум программистов, компьютерный форум CyberForum.ru

Разобрать пример указателя на символьный массив - C++

Войти
Регистрация
Восстановить пароль
 
daslex
1088 / 498 / 102
Регистрация: 02.08.2011
Сообщений: 2,462
12.05.2012, 21:56     Разобрать пример указателя на символьный массив #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
void main()
{  
  const N=256;
  char S[N]="zzzzz";
  char *s[]={""};
 
     s[0]=&S[0];
 
   *s="xxxxxxxx";
  cout<<*s<<endl; 
  cout<<S<<endl;
}
Читаю приблизительно такое: По определению если указатель[i] указывает на определенный элемент массива, то указатель[i+1] указывает на следующий элемент массива. И читаю, что если разыменовать указатель и присвоить ему значение, то изменится и тот объект на адрес которого он ориентирован.

Вот понять не могу. Почему тогда массив S не изменился.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
12.05.2012, 23:46     Разобрать пример указателя на символьный массив #2
так и есть
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
  const int N=256;
  char S[N]="zzzzz";
  char *s;
 
    s=S;
 
  *s='x'; //s[0]='x';
  *(s+1)='x'; //s[1]='x';
  cout<<s<<endl;
  cout<<S<<endl;
return 0;
}
daslex
1088 / 498 / 102
Регистрация: 02.08.2011
Сообщений: 2,462
13.05.2012, 00:03  [ТС]     Разобрать пример указателя на символьный массив #3
Ясно. отдельно взятый символ меняет, а сразу целиком строку нет.

А сам процесс как проходит? Вот идет присвоение указателю адреса первого элемента из массива. а Потом что? Без указания конкретного элемента указатель вообще никак с массивом не связан? Просто скопировал данные из массива в какие-то другие места памяти и обращается к данным по своим источникам?

Мне бы процесс понять
go
Эксперт C++
3584 / 1364 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
13.05.2012, 00:05     Разобрать пример указателя на символьный массив #4
Цитата Сообщение от daslex Посмотреть сообщение
s[0]=&S[0];
тоже, что и
C
1
s[0] = S;
Теперь понимаете?
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
13.05.2012, 00:17     Разобрать пример указателя на символьный массив #5
Цитата Сообщение от daslex Посмотреть сообщение
Без указания конкретного элемента указатель вообще никак с массивом не связан?
указатель содержит адрес какого-то элемента массива (имя массива, само по себе является указателем на его первый элемент). Относительно его и происходит какие-то действия? например s+1 адрес следующего элемента, ++s присваивает s адрес следующего элемента
daslex
1088 / 498 / 102
Регистрация: 02.08.2011
Сообщений: 2,462
13.05.2012, 00:21  [ТС]     Разобрать пример указателя на символьный массив #6
Цитата Сообщение от go Посмотреть сообщение
Теперь понимаете?
Да, я понимаю что это значит, чуть выше написано ровно столько сколько понимаю. Это присвоение в первый элемент указателя значения из первого элемента взятого по адресу первого элемента массива. Но я не понимаю почему если я указываю присвоение указателю значения в двойных кавычках, то даже первый элемент в массиве не изменяет значение.
go
Эксперт C++
3584 / 1364 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
13.05.2012, 00:34     Разобрать пример указателя на символьный массив #7
daslex, а так
C
1
2
3
4
5
6
7
8
9
10
11
12
void main()
{  
  const N=256;
  char S[N]="zzzzz"; 
  char *s[]={""}; 
 
     s[0]=&S[0]; // в s[0] должен занестись адрес первого элемента, но так как адрес в С++ в большинстве это 4 байта, то не можем его поместить правильно в однобайтную переменную!!! ОШИБКА!!!
 
   *s="xxxxxxxx"; // Аналогичеая ситуация
  cout<<*s<<endl;  
  cout<<S<<endl; // Здесь должны увидеть что-то вроде "*zzzz", где * - непонятно что
}
daslex
1088 / 498 / 102
Регистрация: 02.08.2011
Сообщений: 2,462
13.05.2012, 00:48  [ТС]     Разобрать пример указателя на символьный массив #8
Да. так понятнее. А если можно, то как без ошибки поменять массив используя разыменованный указатель тогда? такое у меня не срабатывает s=S (lvalue required)
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
13.05.2012, 00:58     Разобрать пример указателя на символьный массив #9
Цитата Сообщение от daslex Посмотреть сообщение
поменять массив
что вы имеете ввиду? вы хотите сразу целиком изменить массив?
такое в с/с++ нельзя сделать, только поэлементно.
go
Эксперт C++
3584 / 1364 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
13.05.2012, 01:01     Разобрать пример указателя на символьный массив #10
Цитата Сообщение от daslex Посмотреть сообщение
такое у меня не срабатывает s=S (lvalue required)
Конечно не сработает.
Цитата Сообщение от daslex Посмотреть сообщение
А если можно, то как без ошибки поменять массив используя разыменованный указатель тогда?
Что значит поменять?
Допустим
C
1
2
3
char s1[BUFSIZ] = "111";
char s2[BUFSIZ] = "2222";
// Вы хотите, что бы в массиве s1 было 2222, а s2 111. Если я правильно Вас понял
Используем буфер
C
1
2
3
4
char *p = strdup(s1);
strcpy(s1, s2);
strcpy(s2, p);
free(p);
Добавлено через 1 минуту
Цитата Сообщение от antoha398 Посмотреть сообщение
такое в с/с++ нельзя сделать, только поэлементно.
Тогда уж побайтно!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2012, 01:07     Разобрать пример указателя на символьный массив
Еще ссылки по теме:

C++ Массив указателей на символьный массив
C++ Указатели и ссылки - разобрать пример применения
C++ Разобрать пример вычисления интеграла
C++ Заполнить символьный массив в классе
Sizeof и Динамический символьный массив! C++

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

Или воспользуйтесь поиском по форуму:
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
13.05.2012, 01:07     Разобрать пример указателя на символьный массив #11
Цитата Сообщение от go Посмотреть сообщение
Тогда уж побайтно!
Поэлементно или побайтно, главное что целиком и сразу нельзя)
Yandex
Объявления
13.05.2012, 01:07     Разобрать пример указателя на символьный массив
Ответ Создать тему
Опции темы

Текущее время: 09:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru