指针这部分,还是要多写多看,反复翻看笔记。
1. *,一个星号,有2个作用(2种情况,2种含义)很容易混淆,而且都是用星号(*)。
-
int* p = &something, 此时的 *, 是定义一个指针,指向某个变量的地址。
-
*p = *p + 1, 这里的 *, 指的是 取值符(对应取址符, &。 这里多写一句,这里的 *, 专业一点,叫做"解引用运算符". 但是我还是觉得 “取值”比较简单 + 好记。
2. 下面的例子,把指针作为函数的参数,可以直接修改一些外部的变量值。见注释.
#include<stdio.h>
#include<string.h>
void add(int* p) {
// 1.传入的 *p, 表示 指针 p, 即 p 是一个指针。
// 2. 下面这个 *p, 指的是 取值, 即具体的值。
// 由于直接在内存地址上操作了,所以返回类型是 void,
// 但是实际上,p 的值已经被修改了。
*p = *p + 1;
}
int main() {
int a = 1;
printf("a is %d\n", a); // 输出 a is 1
int *pa = &a;
add(pa);
printf("a is %d\n", a); // 输出 a is 2
return 0;
}
3. 使用指针来遍历数组, 记住一句话:
在C语言中,数组名data, 可以被视为指向数组第一个元素的指针。
示例代码:
#include <stdio.h>
#include <string.h>
// 使用指针来遍历数组
int main(void) {
// 在C语言中,数组名data可以被视为指向数组第一个元素的指针。
int data[5] = {1, 2, 3};
for (int i=0; i< 5; ++i){
// (data + i), 即为数组元素的地址, 可以当做是一个指针!
printf("data[i] address is: %p\n", (data + i));
// *(data + i), 即为数组元素的值. 就是 取值符
printf("data[i] is: %d\n", *(data + i));
}
return 0;
}
// 输出:
// data[i] address is: 00000032a09ffa90
// data[i] is: 1
// data[i] address is: 00000032a09ffa94
// data[i] is: 2
// data[i] address is: 00000032a09ffa98
// data[i] is: 3
// data[i] address is: 00000032a09ffa9c
// data[i] is: 0
// data[i] address is: 00000032a09ffaa0
// data[i] is: 0