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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,668
#1

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

12.05.2012, 21:56. Просмотров 1056. Ответов 10
Метки нет (Все метки)

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 не изменился.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2012, 21:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разобрать пример указателя на символьный массив (C++):

Разобрать пример с Random - C++
господа программисты! разъясните ка что тут происходит?? я не въезжаю... рандом от минус бесконечности и до плюс?? data =...

Разобрать пример вычисления интеграла - C++
Здравствуйте, я разбираю пример кода, написанный преподом, где у него вычисляется интеграл (методом криволинейных трапеций (средних...

Указатели и ссылки - разобрать пример применения - C++
У меня всё очень плохо с указателями и ссылками, не понимаю как они работают и тд. Нужно объяснение вот этого кода: int Age = 30; int...

Чем отличаются двумерный символьный массив и массив указателей на строки - C++
Двумерный символьный массив и массив указателей на строки. Собственно чем они отличаются? Заранее спасибо.

32-разрядный символьный массив - C++
Как представить в виде 32 разрядного символьного Массива целое число?O_o

Литерный, символьный массив - C++
1)Объявить строку ng3 как литерный массив, не указав длину строки, и инициализировать ее значением “HTML++Java”. 2)Объявить массив er из...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,668
13.05.2012, 00:03  [ТС] #3
Ясно. отдельно взятый символ меняет, а сразу целиком строку нет.

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

Мне бы процесс понять
go
Эксперт C++
3586 / 1366 / 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
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,668
13.05.2012, 00:21  [ТС] #6
Цитата Сообщение от go Посмотреть сообщение
Теперь понимаете?
Да, я понимаю что это значит, чуть выше написано ровно столько сколько понимаю. Это присвоение в первый элемент указателя значения из первого элемента взятого по адресу первого элемента массива. Но я не понимаю почему если я указываю присвоение указателю значения в двойных кавычках, то даже первый элемент в массиве не изменяет значение.
go
Эксперт C++
3586 / 1366 / 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
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,668
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++
3586 / 1366 / 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 Посмотреть сообщение
такое в с/с++ нельзя сделать, только поэлементно.
Тогда уж побайтно!
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
13.05.2012, 01:07 #11
Цитата Сообщение от go Посмотреть сообщение
Тогда уж побайтно!
Поэлементно или побайтно, главное что целиком и сразу нельзя)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2012, 01:07
Привет! Вот еще темы с ответами:

Массив указателей на символьный массив - C++
Программа пишет название месяца, после ввода переменной &quot;y&quot;. #include &lt;stdio.h&gt; #include &lt;iostream.h&gt; char* int2month(int nMonth); ...

Символьный массив и указатель на char - C++
Читал уже где-то на форуме тему, где показывалась разница между:char mas=&quot;Hello&quot;; char * ptr=&quot;World&quot;; Но из всего я понял только то, что...

Sizeof и Динамический символьный массив! - C++
В первом примере sizeof показывает кол-во элементов в массиве! #include&lt;iostream&gt; #include&lt;cmath&gt; using namespace std; void main() ...

Разделить символьный массив на лексемы - C++
Нужно разделить символьный массив на лексемы. Новая лексема - от и до мат. знака (&quot;+&quot;, &quot;-&quot;, &quot;*&quot;,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.05.2012, 01:07
Ответ Создать тему
Опции темы

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