C 程序的输出 | 12套
预测以下程序的输出。
问题 1
int fun(char *str1)
{
char *str2 = str1;
while(*++str1);
return (str1-str2);
}
int main()
{
char *str = "geeksforgeeks";
printf("%d", fun(str));
getchar();
return 0;
}
输出:13
在 fun() 中,指针 str2 被初始化为 str1 并且 str1 被移动直到到达 '\0' (注意;在 while 循环之后)。所以 str1 将增加 13(假设 char 占用 1 个字节)。
问题2
void fun(int *p)
{
static int q = 10;
p = &q;
}
int main()
{
int r = 20;
int *p = &r;
fun(p);
printf("%d", *p);
getchar();
return 0;
}
输出:20
在 fun() 中,q 是指针 p 的副本。因此,如果我们将 q 更改为指向其他内容,则 p 不受影响。
问题 3
void fun(int **p)
{
static int q = 10;
*p = &q;
}
int main()
{
int r = 20;
int *p = &r;
fun(&p);
printf("%d", *p);
getchar();
return 0;
}
输出 10
请注意,我们将 p 的地址传递给 fun()。 fun() 中的 p 实际上是指向 main() 中 p 的指针,我们正在更改 fun() 中 p 的值。所以 main 的 p 变成了 fun() 的 q 点。为了更好地理解它,让我们将 fun() 中的 p 重命名为 p_ref 或 ptr_to_p
void fun(int **ptr_to_p)
{
static int q = 10;
*ptr_to_p = &q; /*Now p of main is pointing to q*/
}
另外,请注意该程序不会引起任何问题,因为 q 是一个静态变量。即使在函数返回之后,静态变量也存在于内存中。对于自动变量,我们可能会看到一些奇怪的输出,因为函数返回后自动变量可能不存在于内存中。