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
指向的同一记忆位置?
答案 0 :(得分:5)
变量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 :(得分: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
的值。