sizeof char указатель и указатель на указатель - PullRequest
0 голосов
/ 30 июня 2019

Рассмотрим это:

    char *word;
    char **sentence;

Почему sizeof(*word) возвращает 1 и почему sizeof(*sentence) возвращает 8?

Спасибо.

Ответы [ 4 ]

2 голосов
/ 30 июня 2019

Если у вас есть указатель, объявленный в форме type *name, то sizeof(*name) эквивалентно sizeof(type).Если вы хотите размер фактического указателя, то опустите звездочку и используйте sizeof(name).

1 голос
/ 30 июня 2019

word имеет тип char*, который имеет размер, определенный реализацией (по-видимому, 8 в вашей системе).

*word имеет тип char, который по определению имеет размер1 байт.

sentence имеет тип char**, указатель на указатель на char.

*sentence имеет тип char*, который имеет ту же реализацию-определенный размер как word.

**sentence имеет тип char.

Выражение sizeof expr (или sizeof (expr) эквивалентно sizeof (TYPE), где TYPEтип expr. expr не оценивается, если это операнд sizeof (если только он не является массивом переменной длины).

0 голосов
/ 30 июня 2019

Поскольку размер любого указателя на любой тип равен размеру слова, которое является машиной или зависит от компилятора и остается одинаковым для всех указателей типов данных, в вашем случае это это 8 байт. Теперь размер символа составляет 1 байт. sizeof(*word) дает размер байта, на который указывает указатель слова, который является символ, поэтому он дает 1 байт.

сейчас **sentence - указатель указателя (двойной указатель), который означает, что при использовании sizeof(*sentence) это на самом деле дает вам размер указателя, на который указывает **character указатель, который составляет 1 слово, поэтому он дает 8 байтов.

Указатель похож на поток (ссылку) на блок (адрес памяти в байтах), в котором некоторые элемент (значение) размещен. То же, что и «для хранения больших предметов, вам нужна большая коробка (размер зависит от тип данных) "но поток (ссылка) не должен зависеть от размера элемента или блока, они остаются одинаковыми указать любую клетку.

Но при использовании двойного указателя вы на самом деле используете поток в поле, которое содержит другой поток к фактическому блоку, в который помещено значение.

так вы получите размер первого указателя, который содержит ссылку на фактическое значение типа данных.

если вы используете sizeof(**sentence), вы получите вывод 1.

0 голосов
/ 30 июня 2019

Типы выражений разные:

  • Тип выражения * слово - это символ, размер символа - 1
  • Тип выражения * предложение - * char, размер * char - 8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...