Указатель C и временная переменная - PullRequest
2 голосов
/ 25 декабря 2011
int main()  
{  
    int i=0;  
    int* p_numbers = ((int*) malloc (5*sizeof(int)));  
    int* temp;  
    temp = p_numbers;  
    for(i=0;i<5;i++)  
    {  
        *temp=i;   
        printf("temp %d p_numbers %d",*temp,*p_numbers);  
        temp++;           
    }
}

Пожалуйста, скажите, что указатель назначен на temp т.е. temp=p_numbers.

НЕ temp не указывает на ту же позицию памяти, на которую указывает p_numbers?

Ответы [ 7 ]

5 голосов
/ 25 декабря 2011

Переменные temp и p_numbers будут указывать на одну и ту же ячейку памяти на первой итерации цикла. После этого temp увеличивается на целое число, а p_numbers - нет.

Из-за назначений p_numbers = [0,1,2,3,4], поэтому вы распечатаете:

temp 0 p_numbers 0
temp 1 p_numbers 0
temp 2 p_numbers 0
temp 3 p_numbers 0
temp 4 p_numbers 0

Думайте об указателях как об указателях на адрес памяти, а не как о синтаксисе ссылок Java.

1 голос
/ 27 декабря 2011

Из-за этого оператора оба указателя указывают на одну и ту же ячейку памяти.

temp = p_numbers;

В цикле for приращение temp указывает на предыдущие области памяти, что отличает его от p_numbers.

1 голос
/ 25 декабря 2011
    int* p_numbers = ((int*) malloc (5*sizeof(int)));  

              +---+---+---+---+---+ 
p_numbers --> | x | x | x | x | x |
              +---+---+---+---+---+ 


    int* temp;  
    temp = p_numbers;  

p_numbers --+    +---+---+---+---+---+ 
            +--> | x | x | x | x | x |
temp--------+    +---+---+---+---+---+ 

вам также нужно освободить p_numbers, так как в противном случае вы получите утечку памяти.

также, пожалуйста, возьмите за правило не приводить возвращаемое значение из malloc, потому что в некоторых случаях это может привести к трудным поискам ошибок

объяснение:

значение malloc определено stdlib.h, если вы забудете включить этот заголовок, по умолчанию предполагается, что функция malloc будет возвращать int, как в C для функций, не имеющих прототипа. Теперь, если у вас есть что-то вроде char*p = (char*)malloc(12);, это может вызвать проблемы, потому что вы фактически преобразуете integer в char*. При явном приведении вы заставляете замолчать предупреждения от компилятора, и если у вас есть аппаратное обеспечение / ОС, где sizeof(char*) != sizeof(int), вы можете столкнуться с трудностями при обнаружении ошибки, поэтому просто напишите

p_numbers = malloc(5*sizeof(int))

если вы используете компилятор C ++, используйте new/delete.

1 голос
/ 25 декабря 2011

Temp указывает на то же место в памяти, что и точка p_numbers

ответ на ваш код будет

temp 0 p_number 0

temp 1 p_number 0

temp 2 p_number 0

temp 3 p_number 0

temp 4 p_number 0

использовать p_number ++, чтобы указатель p_number также увеличивался.

1 голос
/ 25 декабря 2011

temp указывает на то же место в памяти, что и p_numbers.Но цикл for даст другой результат.так как вы только увеличиваете адрес временной памяти.вам также нужно увеличить адрес памяти p_number.

temp++;            
p_numbers++; 

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

1 голос
/ 25 декабря 2011

Да, это так.

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

Посмотрите, чтопроисходит, когда вы увеличиваете их оба:

int main()  
{  
    int i=0;  
    int* p_numbers = ((int*) malloc (5*sizeof(int)));  
    int* temp;  
    temp = p_numbers;  
    for(i=0;i<5;i++)  
    {  
        *temp=i;   
        printf("temp %d p_numbers %d",*temp,*p_numbers);  
        temp++;           
        p_numbers++;    // see the result when you add this line
    }
}

output:

temp 0 p_numbers 0temp 1 p_numbers 1temp 2 p_numbers 2temp 3 p_numbers 3temp 4 p_numbers 4

Кстати, не важно, но более эффективно предварительно увеличивать, чем после увеличения (++i, ++temp, ++p_numbers) нет необходимости делать копию переменной перед ее возвратом.

0 голосов
/ 25 декабря 2011

Да, вы устанавливаете значение указателя temp на значение указателя p_numbers.

...