我是指针的新手。 对于以下程序,我得到255而不是20的答案。请建议如何纠正。
以下是代码:
int sum(int *a , int *b);
int main()
{
int *p;
int *q;
*p =10;
*q =10;
int c = sum(p,q);
printf("%d",c);
}
int sum(int *a , int *b)
{
return((*a)+ (*b));
}
答案 0 :(得分:3)
有数据,然后有指针。为简单起见,一旦有了数据,就可以指向它。这是通过使用&
运算符完成的。要返回指针中的数据,请使用*
运算符
更像是
int sum(int *a , int *b);
int main()
{
int p_data=10;
int q_data=10;
int *p =&p_data;
int *q =&q_data;
int c = sum(p,q);
printf("%d",c);
}
int sum(int *a , int *b)
{
return((*a)+ (*b));
}
编辑:另请注意,指针可用于访问从malloc
或mmap
'd或其他方式分配的内存
答案 1 :(得分:3)
您需要为指针分配内存。这段代码应该有效:
#include <stdio.h>
#include <stdlib.h>
int sum(int *a , int *b);
int main()
{
int *p = (int*) malloc(sizeof(int));
int *q = (int*) malloc(sizeof(int));
if (p != NULL && q != NULL)
{
*p =10;
*q =10;
int c = sum(p,q);
printf("%d", c);
free(p);
free(q);
}
else
{
printf("Could not allocate enough memory");
return 1;
}
return 0;
}
int sum(int *a , int *b)
{
return (*a) + (*b);
}
希望这有帮助!
答案 2 :(得分:0)
指针是一个保存另一个变量地址的变量,这对你来说似乎很清楚。但似乎还不是很清楚的是,当你创建一个指针时,编译器也不会自动创建一个指向...的变量。
在代码中:
int *p;
int *q;
*p =10;
*q =10;
您将p
和q
定义为指向int的指针,但指向哪些类型int
的变量?他们内部有垃圾,可以指向任何地方,所以当他们指出10点时,实际上,你在内存中的垃圾邮件。
在这些条件下,当你调用sum
时,我会期望更多的内存错误而不是奇怪的值(255
),但是一切都可能发生错误的指针,甚至访问现有的内存。
正确的代码是:
int sum(int *a , int *b);
int main()
{
int i1, i2; //Allocate 2 int variables
int *p = &i1; //Create pointers and assign them
int *q = &i2; //the address of int vars i1 and i2
*p =10; //Initialize variables pointed by pointers with 10
*q =10;
int c = sum(p,q);
printf("%d",c);
}
int sum(int *a , int *b)
{
return((*a)+ (*b));
}
答案 3 :(得分:0)
另一种方法。我认为它对返回函数可能没用,但它可以帮助你指点它是passing pointer to the sum function
#include <stdio.h>
int sum(int *a , int *b);
int main()
{
int p = 10;
int q = 10;
int c = sum(&p,&q);
printf("%d",c);
}
int sum(int *a , int *b)
{
return((*a)+ (*b));
}
答案 4 :(得分:0)
指针需要指定一些有效内存的地址,指向它之前可以取消引用*
- 运算符,并将一些数据写入指向的位置。
你错过了那些作业。
取消引用指针意味着读出其值。如果没有为指针变量赋值,那么已经读出它的值可能会调用臭名昭着的未定义行为,之后就会发生任何事情。
所以你的结果也可能只是着名的42
。
获得的经验:永远不要将任何操作符应用于尚未正确初始化的变量。
答案 5 :(得分:-2)
你得到255是因为随机运气。当我编译它时我得到20,但这也是随机的运气。技术术语是&#34;未定义的行为&#34; ,这是未定义的,因为您从未初始化int *p
和int *q
指针。
你的指针变量里面有什么?你不知道,我不知道,没有人知道。由于您从未初始化它们,因此它们的内容是初始化之前的任何位。这就像搬进一所房子,得到以前的租户留给你的任何垃圾。
如果指针的内容是内存中的地址(并且它们不重叠),则返回的值应为20(随机运气)。但是,如果其中一个包含空地址,谁知道你会得到什么!
如果你想要可靠地获得20,你需要分配内存:
在C ++中:
int * p = new int;
int * q = new int;
在C:
int * p = (int*)malloc(sizeof(int))
int * q = (int*)malloc(sizeof(int))