学习中对C指针的质疑
在大学学习C语言时,我遇到了一些关于指针的不确定因素,所以我写了我能想到的最简单的代码学习中对C指针的质疑,c,pointers,C,Pointers,在大学学习C语言时,我遇到了一些关于指针的不确定因素,所以我写了我能想到的最简单的代码 void test1(int *int_pointer) { *int_pointer = 5; } void test2(int *int_pointer) { int i = 6; int_pointer = &i; } int main(void) { int n = 8; int *p = &n; test1(p); te
void test1(int *int_pointer) {
*int_pointer = 5;
}
void test2(int *int_pointer) {
int i = 6;
int_pointer = &i;
}
int main(void) {
int n = 8;
int *p = &n;
test1(p);
test2(p);
}
为什么如果Iprintf(“%I”,*int\u指针)
进入test2函数,它会输出6,而主函数中的printf(“%I”,*p)
会输出5(而不是6)
第二个问题是关于以下代码
int main (void) {
int var1 = 10;
int * var1p = & var1;
int var2 = * var1p / 2;
int * var2p = &var2;
var1 = 40;
printf("%i", * var2p);
}
为什么在这种情况下,如果我将var1值和var2p指向var2(等于*var1p/2),结果是5而不是20
提前感谢。
test1
修改int\u指针所指向的变量(main
的n
)
test2
修改指针本身。参数变量是它们所属函数的局部变量,更改它们对调用方没有影响
例如,以下内容对调用方也没有影响:
void test3(int i) {
i = 9;
}
test(n);
如果要修改调用者中的指针,则必须传递指向该指针的指针
void test4(int **int_pointer_pointer) {
int *int_pointer = malloc(sizeof(int));
*int_pointer = 10;
*int_pointer_pointer = int_pointer;
}
int *int_pointer;
test4(&int_pointer);
printf("%d\n", *int_pointer);
free(int_pointer);
请注意,返回(通常或通过参数)指向局部变量的指针是没有意义的,因为当函数返回时,它不再存在。这就是为什么我使用了malloc
+free
而不是局部变量。在第一种情况下:
- 初始化变量
n
,并将p
指针指向
它
- 然后将
p
(n
的地址)的值提供给test1()
并更改
int\u指针
(并且int\u指针
与p
具有相同的值,因此
更改n
的值
- 当您调用
test2()
并给您相同的地址时,但在
函数更改本地int\u指针的值,使其
指向本地i
,但p
保持不变
这就是为什么在test2()
由int\u指针指向(
),并在main()中打印(
5
由p
指向的值
第二种情况:
- 将
var1
初始化为10,然后使var1p
指向
它
- 然后将
var2
初始化为一半,即var1p
所指的值,因此
10/2=5
- 然后初始化
var2p
,因此它将指向var2
- 之后,更改
var1
的值,但var2
保持不变,
这就是为什么你得了5分
var1
和var2
是两个不同的变量,因此它们有自己的变量
内存中的字段。如果要打印40,则应
var2p
指向var1
,如var2p=&var1
为了更好地理解指针,它帮助用铅笔画出一些图片,这些图片中的小框表示内存,箭头在它们之间指向。在test2
中,函数接收一个指针副本,其中分配了局部变量的地址因此从test2
返回时,test2
中的任何更改都不会在main()中看到
。在下一种情况下,var2
是在var1
重置为40
之前设置的,因此var2
使用的唯一值来自var1=10
时。指针只是一个普通变量,将其他对象的地址作为其值。换句话说,指针指向其他对象所在的地址可以在内存中找到。请记住您是否正在更改指针持有的地址(例如int\u pointer=&i;
),或者您是否正在更改指针持有的地址的内存值(例如*int\u pointer=5;
)注意,在第一种情况下,对指针的纯赋值,在第二种情况下,对取消引用的指针的赋值用于更新存储在指向内存地址的值。。