之前在对按键的分析那里说过会对指针进行单独的讲解,那么废话不多说,现在开始:
对于C语言来说无非就是一个指针对于很多人来说比较难,听到指针就头疼
还有一些人乱用指针,本来就要在程序中规避野指针,他还直接用野指针,所谓
野指针就是没有指向,或者指向不可知的的位置
产生原因也有很多,但是其中最常见的就是:
1. 数组越界,就是一个指针的操作超过了数组的有效范围
2. 未初始化指针
3. 指针释放以后没有置空
这些乱用指针的人就是第二种人,他直接定义了一个指针来充当数组使用,也没有使用
malloc函数为其分配内存,从而造成内存泄漏
在这里,我就总结一下具体该怎么使用指针
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int str[4] = { 1, 2, 3, 4 }; //定义一个数组
int* p = str; //定一个指针指向数组
printf("%d\n", *p); //打印指针指向的值
p++; //指针地址加一
printf("%d\n", *p); //再次打印指针指向的值
return 0;
}
这里我们定义了一个指针,在数组中,内存地址之间的关系是递增的,而指针指向的是数组第一个的地址,所以我们第一次打印应该是1,第二次,我们指针地址加一,现在指向了第二个值,所以应该是2,现在我们运行以下代码看看结果
指针就是地址,就相当于是找到这个变量存放的位置来操作它,我们在运用传参函数的时候传递一个参数是不会对这个变量本身进行操作的,也就是变量内部的操作,和这个变量无关,我们传递的只是这个变量的值,并不是这个变量本身,但是如果我们传递的指针,那么,我们传递的就是这个变量的地址,那么函数内部的操作也会相应改变这个变量的值,我们看看带代码:
#include <stdio.h>
typedef struct {
const char* name;
float score;
}stdent;
void fun1(stdent *std, const char *str, float score)
{
std->name = str;
std->score = score;
}
void fun2(stdent std, const char str[], float score)
{
std.name = str;
std.score = score;
}
int main(void)
{
stdent std;
std.name = "lihua";
std.score = 97.5;
printf("%s, %.1f\n", std.name, std.score);
fun2(std, "Tom", 28.9);
printf("%s, %.1f\n", std.name, std.score);
fun1(&std, "Tom", 28.9);
printf("%s, %.1f\n", std.name, std.score);
return 0;
}
这里我们fun1是传递的指针,fun2是传递的参数,上面我们提到过,这里传参会传递值,但是不会改变外界因素,所以我们的fun2还会是原来的值,但是fun1传递的指针,我们传递的地址,相当于找到了他的位置对他进行修改,在地址上修改,我们看看结果:
看到这里应该能够初步使用指针了吧?