указатель на bool в описании функции

Stasso
Offline
Зарегистрирован: 31.05.2017

Читал описания функций в библиотеке, одна из них void и  на вход прининимает два указателя на логические переменные и по этим указателям запишет 2 bool результата:

void Class12345::function1 ( bool & b1,bool & b2l)

А вторая  вернет bool и запишет len_byrtes байтов по указателю buf:

bool Class12345::function2 ( void * buf, uint8_t  len_byrtes)

Можно ли без вреда для сути дела,  в описании  первой функции использовать звездочку *  как во второй функции, то есть  :

void Class12345::function1 ( bool * b1,bool * b2l)

 

PS: прошу тапками не кидаться, тк я новичек.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

По сути в первом случае компилятор будет контролировать тип переменной адрес которой вы передаете в функцию. Во втором - нет.

Если сравнивать 1 и 3 вариант, то в первом к переменным вы должны обращаться как к переменным (bl=true), а в третьем по этим указателям (*bl=true). В первом случае bl - переменная, в третьем - указатель или адрес. Так что говорить о одинаковости сути тут нельзя.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вы путаетесь Есть указатели, есть ссылки https://habrahabr.ru/post/251091/

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

qwone пишет:

Вы путаетесь Есть указатели, есть ссылки https://habrahabr.ru/post/251091/

Я !? В первом случае ссылки, в третьем указатели. Это разное. 

Самое прикольное, указатель и ссылка после компиляции - адрес переменной.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

brokly пишет:
Я !? В первом случае ссылки, в третьем указатели. Это разное. 

Самое прикольное, указатель и ссылка после компиляции - адрес переменной.

Я говорил ТС. Вообще-то считается, что Си это язык высокого уровня, но с другой стороны Си это язык низкого уровня, где-то как кросс-платформенный ассемблер. Так вот указатели это "облагороженный инструмент" языка низкого уровня. Ссылка это что-то похожее на define, но выполняемое самим компилятором. Когда одна переменая обзывается другим именем. И наконец символы операции [*]  [&]  это не две операции, а четыре совершенно различные операции.  

Stasso
Offline
Зарегистрирован: 31.05.2017

С++ я не знаю совсем и прочитанное в https://habrahabr.ru/post/251091/ для меня новость

Цитата:
... читатель понимает, что, например, в C++ есть ссылки, а в C — нет

brokly пишет:
По сути в первом случае компилятор будет контролировать тип переменной адрес которой вы передаете в функцию. Во втором - нет.
Контролировать = компилировать или иной смысл ?

void Class12345::function1 ( bool & b1,bool & b2l)

 

brokly пишет:
Если сравнивать 1 и 3 вариант, то в первом к переменным вы должны обращаться как к переменным (bl=true), а в третьем по этим указателям (*bl=true). В первом случае bl - переменная, в третьем - указатель или адрес. Так что говорить о одинаковости сути тут нельзя.

Обращаться внутри моей программы, а не внутри библиотеки?  То есть, если объявил переменные b1,  b2 как:

void Class12345::function1 ( bool & b1,bool & b2l)
//......................

bool b1,b2; 
Class12345 FFF;
// то вызывать функцию нужно так?
FFF.function1( b1,b2);

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
void set(byte & a1, byte & a2) {
  a1=5; a2=6
}

void setup() {
byte c1=200, c2=210; // здесь  c1=200, c2=210
cet(c1,c2);
//  а здесь  c1=5, c2=6 и это все что надо знать о ссылках

}

void loop() {
  // put your main code here, to run repeatedly:

}

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Stasso пишет:
Контролировать = компилировать или иной смысл 

Cовсем разные понятия. В первом случае вы обязаны передать по ссылке данные именно того типа, который требуется, в противном случае вы получите ошибку и ничего не скомпилируется. Во втором случае вы сможете без ошибок передать указатель на любой тип данных.
 
Stasso пишет:
то вызывать функцию нужно так
 
Да, можно так.