Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
#1

char * - C++

19.04.2012, 10:48. Просмотров 1206. Ответов 25
Метки нет (Все метки)

Я правильно понимаю, что

C
1
2
char *chbuff = "qwerty";
chbuff+= 2;
этот код передвинет указатель на букву 'e'?
что тогда произойдет с q и w?

Если неправильно понимаю, объясните, что значат эти 2 строчки
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2012, 10:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос char * (C++):

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& - C++
astxx::manager::connection::connection(std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;, unsigned short); ...

Ошибка в cannot convert char * to char вроде поправил теперь выводит ересь( - C++
Всем доброго дня! У меня такая проблемка.... написал программу, но сначала она ругалась на Cannot convert char* to char теперь вроде...

Error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' - C++
error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' void crpost(const statep &amp;struc1) { ...

Ошибка: initializing argument 2 of `char* fgets(char*, int, FILE*) - C++
Написать программу, которая считывает текст из файла и выводит на экран только строки, содержащие двузначные числа Помогите...

Различное поведение функции которая копирует строки с char* t и char t[] - C++
столкнулся с ситуацией которую не могу объяснить пишем функцию которая копирует одну строку в другую: void strstr(char* t,...

Ошибка: call of overloaded 'strchr(char&, char)' is ambiguous - C++
Здравствуйте, прога почему-то ругается на функцию strchr, вот кусок кода: #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include...

25
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
19.04.2012, 15:23 #16
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
char *str = (char *)"qwerty";
В данном случае, насколько мне известно, имеет место UB.
0
diagon
Higher
1932 / 1198 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
19.04.2012, 15:24 #17
Добавлю, что q и w можно получить с помощью chbuff[-2] и chbuff[-1] соответственно.
0
-=ЮрА=-
19.04.2012, 15:32
  #18

Не по теме:

diagon, где здесь

Цитата Сообщение от diagon Посмотреть сообщение
Добавлю, что q и w можно получить с помощью chbuff[-2] и chbuff[-1] соответственно.
добавлю что q и w можно получить для момента после того как осуществили
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
str += 2;

0
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
20.04.2012, 00:01 #19
C++
1
2
3
4
5
6
7
8
9
10
char * str = "qwerty";
    char * ptr = str;//Запомнили начальный адрес строки
    cout<<"str : "<<str<<"\t(adr : "<<&str<<")"<<endl;
    cout<<"ptr : "<<ptr<<"\t(adr : "<<&ptr<<")"<<endl;
    str += 2;
    cout<<"str : "<<str<<"\t(adr : "<<&str<<")"<<endl;
    cout<<"ptr : "<<ptr<<"\t(adr : "<<&ptr<<")"<<endl;
    system("pause");
    return 0;
}
cout<<"str : "<<str<<"\t(adr : "<<&str<<")"<<endl; Почему мы выводить без "*" как указатель? Как компилятор знает, что это указатель? Так же легко запутаться, можно подумать что мы выводим целую переменную.
Я так понимаю, str хранит просто адрес на char, то по идеи если выводит её как str,а не *str, то она должна вывести просто адрес?

cout<<"str : "<<*str<<"\t(adr : "<<&str<<")"<<endl;
0
grizlik78
Эксперт С++
1973 / 1466 / 122
Регистрация: 29.05.2011
Сообщений: 3,033
20.04.2012, 00:11 #20
Компилятор знает, что str указатель из объявления переменной в строке 1. Если бы это был указатель на любой другой тип, кроме char, то вывод cout<<str выдал бы именно адрес. Но указатель на char интерпретируется особым образом и выводится именно содержимое строки, то есть цепочка символов, начиная с данного адреса и до первого нуля. cout<<*str должен вывести только первый символ строки, потому что *str имеет тип одиночного символа char.
1
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
20.04.2012, 00:22 #21
Цитата Сообщение от grizlik78 Посмотреть сообщение
Компилятор знает, что str указатель из объявления переменной в строке 1. Если бы это был указатель на любой другой тип, кроме char, то вывод cout<<str выдал бы именно адрес. Но указатель на char интерпретируется особым образом и выводится именно содержимое строки, то есть цепочка символов, начиная с данного адреса и до первого нуля. cout<<*str должен вывести только первый символ строки, потому что *str имеет тип одиночного символа char.
C++
1
2
int * int = 5;
        cout<<"int : "<<*int<<"\t(adr : "<<&int<<")"<<endl;
А если, это другой тип, например, int, то так надо вывести значение переменной через *int, а если написать просто int - то выведет просто адрес на переменную, то же самое, что &int? Или я не так понял?
0
grizlik78
Эксперт С++
1973 / 1466 / 122
Регистрация: 29.05.2011
Сообщений: 3,033
20.04.2012, 00:33 #22
Переменная не может называться int
C++
1
2
int * p_int = 5;
cout<<"int : "<<*p_int<<"\t(adr : "<<p_int<<")"<<endl;
*p_int выдаст значение, p_int адрес, по которому хранится это значение, а &p_int адрес самой переменной p_int, то есть адрес адреса

Добавлено через 4 минуты
Да, вот ещё не сразу обратил внимание:
C++
1
int * p_int = 5;
5 это значение указателя, то есть это как-бы и есть адрес. И вообще-то в этом месте компилятор выдаст ошибку, поскольку неявное преобразование из int в int* не разрешено.
1
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
20.04.2012, 00:49 #23
grizlik78,
Спасибо большое, теперь я все понял!

Да, да, конечно, эти ошибки вызваны тем, что я торопился писал... извиняюсь
0
-=ЮрА=-
Заблокирован
Автор FAQ
20.04.2012, 00:52 #24
jvov, константный массив int это не строка и простыми заморочками arr += 2 уже не обойтись, вот более менее подобный на функционалы кодов выше вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
using namespace std;
 
int main()
{
    int arr[] = {5,-7,11,25,4};
    int buf[5]= {0};
 
 
    cout<<"input";
    int i, n = sizeof(arr)/sizeof(arr[0]);
    memcpy((void *)buf,(void *)arr,n*sizeof(int));//Скопировали в buf массив arr
    cout<<"\narr : ";
    for(i = 0; i < n; i++)
        cout<<arr[i]<<" ";
    cout<<"\nbuf : ";
    for(i = 0; i < n; i++)
        cout<<buf[i]<<" ";
 
    int m = (n - 2);
    memcpy((void *)buf,&arr[2],m*sizeof(int));//Скопировали в buf массив arr начиная со второго элемента
    
    cout<<"\nchange pointer";
    cout<<"\narr : ";
    for(i = 0; i < n; i++)
        cout<<arr[i]<<" ";
    cout<<"\nbuf : ";
    for(i = 0; i < m; i++)
        cout<<buf[i]<<" ";
    cout<<endl;
    system("pause");
    return 0;
}
1
Миниатюры
char *  
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
20.04.2012, 14:40 #25
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
jvov, константный массив int это не строка и простыми заморочками arr += 2 уже не обойтись, вот более менее подобный на функционалы кодов выше вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
using namespace std;
 
int main()
{
    int arr[] = {5,-7,11,25,4};
    int buf[5]= {0};
 
 
    cout<<"input";
    int i, n = sizeof(arr)/sizeof(arr[0]);
    memcpy((void *)buf,(void *)arr,n*sizeof(int));//Скопировали в buf массив arr
    cout<<"\narr : ";
    for(i = 0; i < n; i++)
        cout<<arr[i]<<" ";
    cout<<"\nbuf : ";
    for(i = 0; i < n; i++)
        cout<<buf[i]<<" ";
 
    int m = (n - 2);
    memcpy((void *)buf,&arr[2],m*sizeof(int));//Скопировали в buf массив arr начиная со второго элемента
    
    cout<<"\nchange pointer";
    cout<<"\narr : ";
    for(i = 0; i < n; i++)
        cout<<arr[i]<<" ";
    cout<<"\nbuf : ";
    for(i = 0; i < m; i++)
        cout<<buf[i]<<" ";
    cout<<endl;
    system("pause");
    return 0;
}

C++
1
int i, n = sizeof(arr)/sizeof(arr[0]);
- вот эту строчку не очень понимаю, это делим длину массива на длину(первый элемент)?

C++
1
int m = (n - 2);
C++
1
m*sizeof(int)
Если не сложно, не могли бы вы пояснить эти строчки?
0
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
20.04.2012, 14:50 #26
sizeof( arr ) возвращает на этапе компиляции размер массива в байтах, sizeof( arr[ 0 ]) же возвращает размер одного элемента в байтах, вместо нулевого элемента можете взять любой другой, нам просто нужно узнать размер элемента.
1
20.04.2012, 14:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2012, 14:50
Привет! Вот еще темы с ответами:

array char* to char* (значения массива указателей в один указатель) - C++
Как сложить(или вывести в формате char*) все значения массива указателей(char *) воедино, то есть сложить строки и назначить результату...

Сделать преобразование unsigned char в char, а затем типу int - C++
Здраствуйте, есть вопрос: Число представлено двумя полями: типа long для рублей и unsigned char - для копеек. Собственно что мне...

функция возвращает массив слов, содержащихся в текстовом сообщении char* Words(char *s) - C++
Стоит такая задача: функция должна возвратить массив слов, содержащихся в текстовом сообщении char* Words(char *s) Как это можно...

Ошибка в работе с файлами: error: incompatible types in assignment of ‘char*’ to ‘char* [255]’ - C++
Суть задания Есть файл допустим 1.txt нужно выполнить обработку этого файла а результат вывести в этот же файл с другим расширением ...


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

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

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