2015-02-10 2 views
0

Предположим, у нас есть Адрес классуказатели на указатели на строки и STRCMP

class Address{ 
public: 
    char addr[6]; 
} 

Если мы имеем ADDRESS1 и ADDRESS2 объектов. Что сравнивает эта линия?

strcmp((char *)&(Address1.addr), (char *)&(Address2.addr)) 

addr - указатель на массив символов. & addr является указателем на указатель на массив символов, а затем вы передаете его в массив символов. Так это должно фактически сравнить два массива символов?

+1

'addr' не является указателем, это массив. В любом случае, 'strcmp (address1.addr, Address2.addr);' будет иметь гораздо больше смысла ... – chris

+1

это неопределенное поведение. strcmp просят обработать 2 указателя в виде строк. Выньте приведения и прочитайте сообщение об ошибке компиляторов – pm100

+0

[strcmp] (http://www.cplusplus.com/reference/cstring/strcmp/) ожидает, что указатели будут привязаны к символу, а не к двойным указателям на символ. – Sheljohn

ответ

2

Во-первых, давайте быть ясно: Существует нет указатель на указатель в поле зрения в любом месте.
Что мы имеем указатель на массив из 6 char.

Поскольку адрес массива всегда адрес его первого элемента, бросок делает (char *)&(Address1.addr) эквивалентно &Address1.addr[0].

Это все еще слишком сложно, однако, в большинстве контекстов (исключения - sizeof, адрес (&) и некоторые другие), массив распадается на указатель на свой первый элемент при использовании.

Таким образом, его можно и нужно записать Address1.addr.

Теперь, если эти массивы содержат строки с 0-концами, все хорошо, хотя нет никакого оправдания для обфускации.
Оно должно быть:

strcmp(Address1.addr, Address2.addr) 
+0

Это не очень хорошо, потому что вы выбрали 'char **' как 'char *'. – Sheljohn

+1

@ Sh3ljohn: Почему это не будет хорошо? Они гарантированно указывают на тот же адрес. – Deduplicator

+1

Ты абсолютно прав на самом деле :) Хм, интересно. Но, честно говоря, я не уверен, что OP следует поощрять думать, что все в порядке. – Sheljohn

2

При прохождении массива T arr[N]; к функции, он будет повышен (или понижен, или что вы хотите назвать его), чтобы T *, так что просто делает

strcmp(ddress1.addr, Address2.addr); 

должен сделать трюк.

Или использовать std::string и не беспокоиться о strcmp на всех (и вам не придется беспокоиться о addr, имеющих более 5 символов, и т.д., и т.д.

2
// "std::string" might be better, but OK... 
class Address{ 
public: 
    char addr[6]; 
} 
... 

// Compare one address with another 
int iret = strcmp (address1.addr, address2.addr); 

// Or, equivalently, 
int iret = strcmp (&address1.addr[0], &address2.addr[0]); 

Вот хорошее обсуждение строк C-типа (с нулевым символом-массивы символов):

https://www.cs.bu.edu/teaching/c/string/intro/

А вот хорошее обсуждение того, что он означает, что «массивы распадаются на указатели»:

http://c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=aryptr

Смежные вопросы