информационная безопасность
без паники и всерьез
 подробно о проекте
Сетевые кракеры и правда о деле ЛевинаSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Модульный ботнет от русских хакеров 
 Торвальдс и вайбтестеры 
 Атака на GitHub 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Почувствуй разницу... ;-) 15.08.01 18:26  Число просмотров: 940
Автор: Glory <Mr. Glory> Статус: Elderman
<"чистая" ссылка>
> Какая разница? главное что бы работало
а разница вот какая. Указатель - это просто число, которое определяетположениекаких-либо данных в памяти. То есть указатель на char[] определяет,гденаходится в памяти эта строка. А значение строки - это собственно данные, которые находятся по данному указателю. Пример (адреса взяты произвольно):
main()
{
char *t = new char[5]; // t = 0x100000 - выделяем память
strcpy(t, "test"); // t = 0x100000 - заполняем сроку новым содержимым
t = "fuck"; // t = 0x666 - изменение указателя на строку. Так делать нельзя.
delete[] t; // Возможна ошибка доступа к памяти
return 0;
}
<programming>
[C++] ссылка на char[] 15.08.01 02:13  
Автор: myrmidon Статус: Незарегистрированный пользователь
<"чистая" ссылка>
хочю сделать ссылку на char массив, что то не выходит
[C++] ссылка на char[] 15.08.01 03:15  
Автор: Ruslan Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> хочю сделать ссылку на char массив, что то не выходит
#define MAX_ENTR 100

char *arrChar[MAX_ENTR]; // у меня так работает
а массив какой двумерный?
char *arrChar[MAX_ENTR][MAX_ENTR];
[C++] мне казалось, ссылка - это другое 15.08.01 08:02  
Автор: Бяша <Biasha> Статус: Member
<"чистая" ссылка>
> > хочю сделать ссылку на char массив, что то не выходит
Если в твоём понимании ссылка - это указатель, то предыдущий ответ тебя устроит:

> #define MAX_ENTR 100
>
> char *arrChar[MAX_ENTR]; // у меня так работает
> а массив какой двумерный?
> char *arrChar[MAX_ENTR][MAX_ENTR];

Если же ссылка - это не совсем указатель, то:
	char V[] = {'1', '2', '3', 0};
	char (&L)[sizeof(V)] = V;
	L[1] = 'L';
	cout << V;

---
Скобки вокруг &L стоят потому, что у [] приоритет больше, чем у & (кстати я всегда закладку в MSDN храню на "operator associativity"), а как сделать без sizeof (и без преобразования типа V) я не знаю (на си меньше года пишу:).
[C++] мне казалось, ссылка - это другое 15.08.01 08:09  
Автор: Ruslan Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> > > хочю сделать ссылку на char массив, что то не
> выходит
> Если в твоём понимании ссылка - это указатель, то
> предыдущий ответ тебя устроит:
>
> > #define MAX_ENTR 100
> >
> > char *arrChar[MAX_ENTR]; // у меня так работает
> > а массив какой двумерный?
> > char *arrChar[MAX_ENTR][MAX_ENTR];
>
> Если же ссылка - это не совсем указатель, то:
>
	char V[] = {'1', '2', '3', 0};> 	char (&L)[sizeof(V)] = V;
> 	L[1] = 'L';
> 	cout << V;

---
> Скобки вокруг &L стоят потому, что у [] приоритет больше,
> чем у & (кстати я всегда закладку в MSDN храню на "operator
> associativity"), а как сделать без sizeof (и без
> преобразования типа V) я не знаю (на си меньше года пишу:).

Ну стормозил.... :), не выспался, да еще и на работе я.... :))))
Тогда я бы сделал:
char V[]={'1', '2', '3',0};
char &p = (char *)V;

по моему должно сработать... :)
[C++] мне казалось, ссылка - это другое 15.08.01 08:15  
Автор: Ruslan Статус: Незарегистрированный пользователь
<"чистая" ссылка>
лучше дома посмотрю! Не фига уже синтаксис не помню...
Во как! 15.08.01 09:06  
Автор: Access Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Пусть есть char массив:
char a[8];

Первый элемент массива (не значене) и является ссылкой, поэтому при передаче ф-ии массива, ф-ия обрабатывает именно его, не делая копии.

А лучше исользуй указатели...
char *s=a; //мы передали указателю ссылку на массив и теперь можно работать с s как с массивом а (можно было и так char *s=a[0];)

А то что тебе показали:
char *[100];
просто создают массив указателей, и это будет работать т.к в указатель можно запихнуть по одному значению.

А если ты хочешь вводить размер массива с клавы, то использую динамическую память:
int n;
cin>>n;
char *a= new char[n]; //захватываем память для n элементов
............ // делаем то что надо
delete []a; //освобождаем память


А если двумерный массив то:
int n,nn;
cin>>n>>nn;
char *a= new *char[n];
for (int i=0;i<n;i++)
a[n]=new char [nn];
.............................
for (i=0i;i<n;i++)
delete a[nn];
delete []a;

[C++] посмотри дома :) 15.08.01 08:38  
Автор: Бяша <Biasha> Статус: Member
<"чистая" ссылка>
> лучше дома посмотрю! Не фига уже синтаксис не помню...

То что ты сегодня написал (char &p = (char *)V;), само собой, не работает :)
Мне тоже интересно, как можно более кратко записать "char (&L)[sizeof(V)] = V;"
И абсолютно не понятно возможно ли это для динамического массива.
[C++] посмотри дома :) 15.08.01 10:53  
Автор: Qrot Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> > лучше дома посмотрю! Не фига уже синтаксис не помню...
>
> То что ты сегодня написал (char &p = (char *)V;), само
> собой, не работает :)
> Мне тоже интересно, как можно более кратко записать "char
> (&L)[sizeof(V)] = V;"
> И абсолютно не понятно возможно ли это для динамического
> массива.
гм.. похоже, что на С++ короче не запишешь
для С прокатывает:
char a[] = "12345";
char *&r = a;
printf(r"\n");

хотя для С++ можно так:
char a[] = "12345";
char * const &r = a;
cout << r << endl;

получется ссылка на постоянный указатель

[C++] посмотри дома :) 15.08.01 09:12  
Автор: Ruslan Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> > лучше дома посмотрю! Не фига уже синтаксис не помню...
>
> То что ты сегодня написал (char &p = (char *)V;), само
> собой, не работает :)
> Мне тоже интересно, как можно более кратко записать "char
> (&L)[sizeof(V)] = V;"
> И абсолютно не понятно возможно ли это для динамического
> массива.
завтра скажу, где-то между 16:00 до 00:00 :))))))
[C++] Вообщем так 15.08.01 11:19  
Автор: myrmidon Статус: Незарегистрированный пользователь
Отредактировано 15.08.01 11:21  Количество правок: 1
<"чистая" ссылка>
Короче есть функция, с параметром char sz1[0x100];
я хочю что бы этот парпметр был ссылкой, так как если в функции есть ссылочный параметр, то получается например так:

int i = 0;

void func(int& p)
{
p++;
}

при вызове func(i);
i == 1;
тоесть мне надо шобы функция изменяла один из своих параметров типа массива char , ну или указателя на char, вообщем на строковый параметр
Так те надо изменить строку или указатель? 15.08.01 11:26  
Автор: Glory <Mr. Glory> Статус: Elderman
<"чистая" ссылка>
[C++] Так те надо изменить строку или указатель? 15.08.01 11:45  
Автор: myrmidon Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Какая разница? главное что бы работало
[C++] Почувствуй разницу... ;-) 15.08.01 18:26  
Автор: Glory <Mr. Glory> Статус: Elderman
<"чистая" ссылка>
> Какая разница? главное что бы работало
а разница вот какая. Указатель - это просто число, которое определяетположениекаких-либо данных в памяти. То есть указатель на char[] определяет,гденаходится в памяти эта строка. А значение строки - это собственно данные, которые находятся по данному указателю. Пример (адреса взяты произвольно):
main()
{
char *t = new char[5]; // t = 0x100000 - выделяем память
strcpy(t, "test"); // t = 0x100000 - заполняем сроку новым содержимым
t = "fuck"; // t = 0x666 - изменение указателя на строку. Так делать нельзя.
delete[] t; // Возможна ошибка доступа к памяти
return 0;
}
[C++] Так те надо изменить строку или указатель? 15.08.01 16:52  
Автор: Qrot Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Какая разница? главное что бы работало
ЧТО ЗНАЧИТ КАКАЯ РАЗНИЦА?!! ЧЕГО НАДО-ТО? указатель на строку - это одно, а содержимое строки это другое!

пример:
char *p = "1234";
p - это указатель на область памяти со данными "1234"

так тебе надо изменить значение p или "1234" поменять на "4321"?
если нужно поменять содержимое строки то можешь обойтись без ссылок
если нужно поменять значение указателя то пиши char (&V)[0x100] (вроде бы)



[C++] Так те надо изменить строку или указатель? 15.08.01 23:09  
Автор: myrmidon Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Да я знаю какая разница между указателем и не указателем, фишка в том, что в итоге всё равно будет строка!
[C++] ... едет не спеша. 16.08.01 07:35  
Автор: Бяша <Biasha> Статус: Member
Отредактировано 16.08.01 07:40  Количество правок: 1
<"чистая" ссылка>
> Да я знаю какая разница между указателем и не указателем,
> фишка в том, что в итоге всё равно будет строка!
Ты подумай, что ты сказал.
Тебя спрашивают, что тебе нужно изменить, а тебе пофиг - чего спрашивать тебе тогда, всё равно выйдет строка.

Короче если есть ещё вопросы, то прочитай текст ниже несколько раз и напиши на бумажке то, что по твоему мнению выведет программа. После чего посмотри, что же она действительно выводит. Если это не то, что ты написал, то перечитывай нитку, книжки пока не поймёшь.
#include <iostream.h>

void funk1(char *a){ a[1]++; a++;}
void funk2(char *&a){ a[1]++;}
void fuck(char *&a){ a++;}

int main()
{
	char V[] = {'1', '2', '3', 0};
	char *a = V;

	cout << "a: " << a << endl;
	funk1(a);
	cout << "funk1: " << a << endl;
	funk2(a);
	cout << "funk2: " << a << endl;
	fuck(a);
	cout << "fuck: " << a << endl;

	return 0;
}

---
2Бяша ...Отличный пример! 16.08.01 10:24  
Автор: Xan Статус: Незарегистрированный пользователь
<"чистая" ссылка>
1





Рейтинг@Mail.ru


  Copyright © 2001-2026 Dmitry Leonov   Page build time: 1 s   Design: Vadim Derkach