我正在学习C作为课程的一部分,我仍在学习指针的概念。以下示例为我提供了不可预测的结果。
#include <stdio.h>
void Calculate(int *x, int *y, int *k, int *m) {
k = *x * *y;
m = *x + *y;
}
int main() {
int *k;
int *m;
int g = 10;
int h = 11;
Calculate(&g, &h, k, m);
printf("%dn", m);
printf("%d", k);
}
每次执行都会给我不同的结果,比如
-1155180448
0
或
253276384
0
或 591649904 0
但是如果我将代码更改为
#include <stdio.h>
void Calculate(int *x, int *y, int *k, int *m) {
*k = *x * *y;
*m = *x + *y;
}
int main() {
int k;
int m;
int g = 10;
int h = 11;
Calculate(&g, &h, &k, &m);
printf("%dn", m);
printf("%d", k);
}
它打印正确的值,例如
21
110
使用int *k; int *m;
并将其传递给函数不是somefunc(k, m)
与int k; int m; somefunc(&k, &m)
相同吗?
请解释这里有什么问题。
谢谢。
函数应该是:
void Calculate(int *x, int *y, int *k, int *m) {
*k = *x * *y;
*m = *x + *y;
}
*k
表示存储在内存中的int
由k
指向。您不想修改k
,而是要修改存储在k
指向的空间中的内容。
然后你这样打电话:
int a, b;
int g = 10;
int h = 11;
Calculate(&g, &h, &a, &b);
你告诉Calculate
函数在内存中的下落,a
和b
变量将保存计算结果。
注意:我使用了不同的变量名称,因为在一个地方对int
使用相同的名称k
,而在另一个地方对int *
使用相同的名称k
会令人困惑。当然,另一个计划是在main
中使用k,m
,并在函数中使用pk
或pm
(意思是"指向k
的指针"等)。
此外,您不需要使用指针来传递g
和h
实际上这是一个坏主意,除非您也打算在函数中更改它们。
如果您真的想像第一个示例中一样测试此调用Calculate(&g, &h, k, m);
,将整数g
和h
和整数指针传递*k
和*m
,首先确保指针确实指向某些内容,以便Calculate()
函数可以将它们视为整数变量的地址, 或任何语法功能。
#include <stdio.h>
#include <stdlib.h> //add this header for malloc
void Calculate(int *x, int *y, int *k, int *m) {
*k = *x * *y;
*m = *x + *y;
}
int main()
{
int *k = malloc(sizeof(int)); //initialize the pointer to point at something
int *m = malloc(sizeof(int)); //initialize the pointer to point at something
int g = 10;
int h = 11;
Calculate(&g, &h, k, m);
printf("%dn", *m);
printf("%dn", *k);
free(k); //free the space pointed to by pointers!
free(m);
return 0;
}
这不是一个非常实用的解决方案(至少就您的示例而言),但这里只是为了展示您应该如何将指针视为调用方函数中的函数参数。