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

char * - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
19.04.2012, 10:48     char * #1
Я правильно понимаю, что

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

Если неправильно понимаю, объясните, что значат эти 2 строчки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
20.04.2012, 00:22     char * #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? Или я не так понял?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
20.04.2012, 00:33     char * #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* не разрешено.
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
20.04.2012, 00:49     char * #23
grizlik78,
Спасибо большое, теперь я все понял!

Да, да, конечно, эти ошибки вызваны тем, что я торопился писал... извиняюсь
-=ЮрА=-
Заблокирован
Автор FAQ
20.04.2012, 00:52     char * #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;
}
Миниатюры
char *  
jvov
1 / 1 / 0
Регистрация: 28.09.2011
Сообщений: 113
20.04.2012, 14:40     char * #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)
Если не сложно, не могли бы вы пояснить эти строчки?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2012, 14:50     char *
Еще ссылки по теме:

C++ Что означает такая запись char *smt=new char[1]?
array char* to char* (значения массива указателей в один указатель) C++
Преобразование char в char* или разделить на две строки C++

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

Или воспользуйтесь поиском по форуму:
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
20.04.2012, 14:50     char * #26
sizeof( arr ) возвращает на этапе компиляции размер массива в байтах, sizeof( arr[ 0 ]) же возвращает размер одного элемента в байтах, вместо нулевого элемента можете взять любой другой, нам просто нужно узнать размер элемента.
Yandex
Объявления
20.04.2012, 14:50     char *
Ответ Создать тему
Опции темы

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