Про указатель в C - PullRequest
       10

Про указатель в C

0 голосов
/ 29 марта 2011

Рассмотрим следующую программу:

#include<stdio.h>
int main()
{
    int marks[]={20,65,45,68,89};
    int *x,*y;
    x=&marks[2];
    y=&marks[4];
    printf("%p\n%p\n"x,y);
    printf("%p\n%p\n",y-x,*y-*x);
    return 0;
} 

Когда я хочу распечатать значение y-x, консоль должна дать мне вывод, равный разнице между адресами соответствующих указателей.В конце концов, мы знаем, что x и y имеют адреса («некоторое целое значение»).Однако это не так.Почему?

Ответы [ 5 ]

3 голосов
/ 29 марта 2011

Вычитание указателя не просто вычитает адреса, а скорее возвращает расстояние между двумя элементами массива (в терминах элементарных элементов).

То есть y - x - не указатель, а целое число значения 2 - и для его печати вы должны использовать форматирование %d, теперь %p.

2 голосов
/ 29 марта 2011

Если вы распечатаете различия с использованием% p, вы, вероятно, получите что-то немного сложное для чтения.

Правильный способ, вероятно, использовать% lu и приведение:

printf("%lu\n", (unsigned long) (y - x));

Печать целого числа *y - *x в виде% p кажется полностью запутанной.

1 голос
/ 29 марта 2011

y-x будет равно 2 - поскольку расстояние между ними составляет 2 дюйма.

Если вы печатаете, например, (char *) y - (char *) x Вы получите расстояние в символах

1 голос
/ 29 марта 2011

Результатом вычитания 2 указателей в одном массиве является расстояние между указателями в массиве, поэтому y-x должно быть равно 2 в вашем примере.

Чтобы получить разницу между адресами, приведите их к целому числу перед вычитанием:

printf("%d",(size_t)y-(size_t)x);
0 голосов
/ 29 марта 2011

консоль должна выдавать вывод, равный разнице между адресами соответствующих указателей

... и это так.Для меня это выводит 2.Если вы сравните адреса, вы увидите, что они разделены 8 байтами, что составляет 2 int с, то есть ответ, который вы искали.

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