2
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++;           
    }
}

请告诉分配给tempie的指针temp=p_numbers

temp指向指向的相同内存位置p_numbers

4

7 回答 7

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 引用语法。

于 2011-12-25T06:58:42.947 回答
2

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

temp++;            
p_numbers++; 

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

于 2011-12-25T07:01:08.020 回答
1

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

对您的代码的回答将是

临时 0 p_number 0

临时 1 p_number 0

临时 2 p_number 0

临时 3 p_number 0

临时 4 p_number 0

使用 p_number++ 使指针 p_number 也增加。

于 2011-12-25T07:07:25.203 回答
1

由于这个语句,两个指针都指向同一个内存位置。

temp = p_numbers;

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

于 2011-12-27T15:27:36.273 回答
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) 更有效,它不需要在返回变量之前制作变量的副本。

于 2011-12-25T06:59:04.133 回答
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改用。

于 2011-12-25T08:29:49.693 回答
0

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

于 2011-12-25T06:59:46.030 回答