C - Указатель и ссылка - PullRequest
       2

C - Указатель и ссылка

0 голосов
/ 05 сентября 2018

Я изучаю информатику и в свободное время пробую язык программирования Си. Кроме того, я использую эту книгу для лучшего понимания: Компьютерные системы: взгляд программиста . Это дает несколько примеров кодов на языке C, а также.

Итак, я написал код с некоторыми указателями, например: int *x. И я все еще борюсь с указателями и ссылками - хотя, думаю, я это понимаю.

Итак, я написал небольшой сценарий и экспериментировал с указателями и ссылками. Код:

#include <stdio.h>

int main() {
        int *x;
        printf("Pointer: %p\n", x);
        printf("Value int: %d\n", *x);
        printf("Pointer ref: %p\n", &x);
}

Вывод в bash / терминал:

Pointer: 0x7ffe99ea7420
Value int: 1
Pointer ref: 0x7ffe99ea7330

(Настройка: Ubuntu 16.04 x86_64)

Теперь я немного запутался, что неинициализированная переменная x имеет значение 1 - и что Указатель и Ссылка указывают на адрес памяти. В моем первом семестре в университете я изучил Java, а также понимаю, как работает JVM и стек. Поэтому я предполагаю, что в Си это тоже самое. Компилятор выделил немного памяти для каждого объекта в коде. Но почему значение x 1 .

Может быть, кто-то был бы так мил и объяснил бы это мне. Я также очень благодарен за любые ссылки для дальнейшего чтения или обмена знаниями.

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

Здесь

int *x;

x - это целочисленный указатель, указатель должен указывать на правильную ячейку памяти , но в вашем случае он неинициализирован. Следовательно, de-referencing(*x) неинициализированный указатель вызывает undefined behavior, т. Е. Может произойти любая вещь, она может произойти сбой.

Итак, ответ на этот вопрос

printf("Value int: %d\n", *x);

- это неопределенное поведение , поскольку x не имеет допустимого расположения в памяти.

А здесь

printf("Pointer ref: %p\n", &x);

вы просто печатаете адрес переменной указателя x, отсутствует понятие ссылка в C .

Редактировать: - С C по стандарту n1570

3.4.3

1 неопределенное поведение поведение, при использовании непортативного или ошибочная программная конструкция или ошибочные данные, для которых это Международный стандарт не предъявляет никаких требований.

Раздел 6,7 Объявления

double *dp;

*dp = 42; // undefined behavior

Неинициализированный указатель никуда не указывает. Прекратить ссылаться на него незаконно.

0 голосов
/ 05 сентября 2018
Pointer: 0x7ffe99ea7420
Value int: 1
Pointer ref: 0x7ffe99ea7330

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

В коде, который вы не инициализировали int *x;, следовательно, он будет иметь неопределенные значения. И все 3 из следующих операторов вызываются для неинициализированной переменной, следовательно, вывод каждого из них равен undefined

printf("Pointer: %p\n", x);
printf("Value int: %d\n", *x);

Однако

printf("Pointer ref: %p\n", &x);

напечатает адрес х.

0 голосов
/ 05 сентября 2018

Неинициализированные переменные имеют неопределенные значения. неопределенное поведение - читать их до того, как они назначены. Поэтому выражения x и *x имеют вид неопределенное поведение .

Очень грубо, неопределенное поведение означает, что может случиться что угодно и что ваш код не работает. Это описано в любой книге C для начинающих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...