Обучение C - Указатели и адресация памяти - PullRequest
2 голосов
/ 18 июля 2010

Я изучаю программирование на C, и у меня есть простой вопрос об указателях ...

Я использовал следующий код, чтобы поиграться с указателями:

#include <stdio.h>

int main (int argc, const char * argv[]) {

int * c;

printf("%x\n",c);
return 0;
}

Когда я печатаю значениеC, я получаю обратно 0. Однако, когда я печатаю & c (то есть printf ("& x \ n", & c), я получаю адрес в памяти ...

Разве я не должен получать адресв памяти при печати указателя (т.е. printf ("% x \ n", c)?

--- EDIT ---

#include <stdio.h>
#include <stdlib.h>

int main (int argc, const char * argv[]) {

    char * a = malloc(11);
    printf("String please\n");
    scanf("%s",a);
    printf("%s",a);

}

Вопроспочему printf ("% s", a) возвращает строку вместо адреса, хранящегося в?

Разве я не должен использовать * a, чтобы следовать за указателем, а затем распечатать строку?

Ответы [ 4 ]

11 голосов
/ 18 июля 2010

ваша текущая программа неверна. Вы определяете переменную и не устанавливаете значение перед первым использованием. начальное значение не гарантируется для c, но вам повезло, и оно равно 0. Это означает, что c указывает на никуда. когда вы печатаете &c, вы печатаете адрес самой переменной c. Так что на самом деле обе версии печатают адрес.

1 голос
/ 18 июля 2010

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

В вашем примере строки:

printf("%s", a)

"% s" сообщает функции printf, что следующая переменная должна рассматриваться как строка.В Си строка - это указатель на один или несколько символов, оканчивающихся символом, содержащим 0. Это довольно распространенный запрос, поэтому printf поддерживает спецификатор формата "% s", который запускает это относительно сложное поведение.Если вы хотите напечатать адрес, содержащийся в указателе строки, вы должны использовать формат, который вы нашли ранее:

printf("%x\n",a);

, который указывает printf обрабатывать содержимое a как целое число без знака и печатать его в базе16.

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

Вы можете напечатать один символ с помощью

printf("%c", *a);
0 голосов
/ 18 июля 2010
#include <stdio.h>

int main (int argc, const char * argv[]) {

int * c;
int a=10;
c = &a;

printf("%x\n",c);
return 0;
}

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

0 голосов
/ 18 июля 2010

Имея int * c; Если вы напечатаете значение c, вы получите значение, которое следует интерпретировать как адрес памяти целочисленного значения. В вашем примере это может быть 0 или что-то совсем другое, поскольку вы не инициализируете c.

Если вы печатаете & c, вы получаете адрес памяти указателя c (хранится в стеке).

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