C指针和临时变量

时间:2011-12-25 06:54:25

标签: c memory pointers temp

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 个答案:

答案 0 :(得分:5)

变量tempp_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 :(得分:1)

是的。

但是当你输出输出时,你只增加其中一个,所以另一个仍指向第一个元素。

看看当你增加它们时会发生什么:

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
    }
}

输出:

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更有效)它不需要在返回之前复制变量

答案 2 :(得分:1)

temp指向与p_numbers相同的内存位置。但是for循环会给出不同的输出。因为你只增加了临时内存地址。你还需要增加p_number的内存地址。

temp++;            
p_numbers++; 

这样两者都指向相同的地址位置并给出相同的输出。

答案 3 :(得分:1)

Temp指向与p_numbers point相同的内存位置

回答你的代码

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也递增。

答案 4 :(得分:1)

    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

答案 5 :(得分:1)

由于此语句,两个指针都指向相同的内存位置。

temp = p_numbers;

在for循环中,递增temp将使其指向先前的内存位置,这使得它与p_numbers不同。

答案 6 :(得分:0)

是的,您将指针temp的值设置为指针p_numbers的值。