1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
1

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

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

Author24 — интернет-сервис помощи студентам
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 не изменился.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.05.2012, 21:56
Ответы с готовыми решениями:

Нужен пример указателя на массив с приведением типа
Нужен пример указателя на массив с приведением типа, чтобы сделать вот так : char test =...

Скопировать одномерный символьный массив в двумерный символьный массив
Здравствуйте, учусь программировать на Си. Столкнулся с проблемой: не могу скопировать одномерный...

Пример указателя на функцию
приведите, пожалуйста, простой пример указателя на функцию в delphi\pascal

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

10
157 / 157 / 27
Регистрация: 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;
}
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
13.05.2012, 00:03  [ТС] 3
Ясно. отдельно взятый символ меняет, а сразу целиком строку нет.

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

Мне бы процесс понять
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
13.05.2012, 00:05 4
Цитата Сообщение от daslex Посмотреть сообщение
s[0]=&S[0];
тоже, что и
C
1
s[0] = S;
Теперь понимаете?
0
157 / 157 / 27
Регистрация: 29.03.2012
Сообщений: 418
13.05.2012, 00:17 5
Цитата Сообщение от daslex Посмотреть сообщение
Без указания конкретного элемента указатель вообще никак с массивом не связан?
указатель содержит адрес какого-то элемента массива (имя массива, само по себе является указателем на его первый элемент). Относительно его и происходит какие-то действия? например s+1 адрес следующего элемента, ++s присваивает s адрес следующего элемента
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
13.05.2012, 00:21  [ТС] 6
Цитата Сообщение от go Посмотреть сообщение
Теперь понимаете?
Да, я понимаю что это значит, чуть выше написано ровно столько сколько понимаю. Это присвоение в первый элемент указателя значения из первого элемента взятого по адресу первого элемента массива. Но я не понимаю почему если я указываю присвоение указателю значения в двойных кавычках, то даже первый элемент в массиве не изменяет значение.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
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", где * - непонятно что
}
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
13.05.2012, 00:48  [ТС] 8
Да. так понятнее. А если можно, то как без ошибки поменять массив используя разыменованный указатель тогда? такое у меня не срабатывает s=S (lvalue required)
0
157 / 157 / 27
Регистрация: 29.03.2012
Сообщений: 418
13.05.2012, 00:58 9
Цитата Сообщение от daslex Посмотреть сообщение
поменять массив
что вы имеете ввиду? вы хотите сразу целиком изменить массив?
такое в с/с++ нельзя сделать, только поэлементно.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
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 Посмотреть сообщение
такое в с/с++ нельзя сделать, только поэлементно.
Тогда уж побайтно!
1
157 / 157 / 27
Регистрация: 29.03.2012
Сообщений: 418
13.05.2012, 01:07 11
Цитата Сообщение от go Посмотреть сообщение
Тогда уж побайтно!
Поэлементно или побайтно, главное что целиком и сразу нельзя)
0
13.05.2012, 01:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.05.2012, 01:07
Помогаю со студенческими работами здесь

Разобрать пример кода C#
Здравствуйте дорогие форумчане! С Рождеством Христовым Вас всех! И с Новым годом! Гармонии Вам и...

Разобрать пример наследования
Вопрос по наследованию: допустип есть базовый класс А; есть производный от класса А класс Б; и...

Разобрать пример анимации
{Данная программа иллюстрирует применение процедур LockDrawing и Redraw для реализации анимации без...

Пример бессмысленного использования указателя
Добрый вечер уважаемые форумчане,у меня к вам просьба.не могли бы вы привести пример,бессмысленного...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru