2014-01-20 3 views
0

У меня был метод, который требовал const unsigned char * в качестве параметра, например.интерпретация строки литерал

func(const unsigned char* p); 

Я назвал это так: func("\x34\x21\x00\x00"); (значение, передаваемое десятичное 8500 в небольшой Endian).

Мой вопрос: почему я мог пройти "\x34\x21\x00\x00" как char*?

Позвольте мне дать краткое объяснение и, пожалуйста, исправьте меня, если я ошибаюсь.

То, что было передано функции , было адресом первого байта строки "\ x34 \ x21 \ x00 \ x00". Строка «\ x34 \ x21 \ x00 \ x00» хранится в памяти, и в основном я передал адрес первого байта этой строки. Я прав?

+0

это C или C++? выглядит C мне. – concept3d

+0

@ concept3d: есть ли что-то здесь, что недействительно в C++? –

+0

да. Это * будет * давать ошибку в C++. В C указатели могут быть неявно лишены. Просто попробуйте оба компилятора, чтобы убедиться, проверьте мой ответ. – concept3d

ответ

2

Да, вы правы. Неважно, что содержит строка: вы передаете адрес своего первого байта.

+1

Неявный указатель поворота является незаконным в C++ – concept3d

1

Это законно в C, указатель будет неявным. В C++, хотя это даст ошибку (просто пробовал в MSVC2010).

+0

Чтобы уточнить, строковый литерал, такой как '' abc '', имеет тип 'char *'. Неявные броски между 'unsigned char *' и 'char *' не разрешены на C++ и плохой практикой в ​​C. Однако суть вопроса OP заключается в том, где хранятся параметры в памяти. Таким образом, этот ответ, вероятно, был бы лучше как комментарий. – Lundin

+0

Хотя вы правы, Лундин, отчасти, фактически предложил ответ, достойный, ну, ответ. Вы могли бы просто добавить такую ​​же информацию в комментарий. – thokra

+0

@thokra Да, я перечитываю вопрос, вы правы, речь идет о памяти, а не о типах данных. – concept3d

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