目录
从0开始记录我的学习历程,我会尽我所能,写出最最大白话的文章,希望能够帮到你,谢谢。
提示:文章作者为初学者,有问题请评论指正,感谢。
1.指针的概念
首先,我们可以把指针想象成一个箭头,它指向了内存中的某个位置。这个位置可以存储数据,比如整数、字符、甚至其他指针。指针的作用就是帮助我们找到这些数据。
2.指针变量的定义方法
1.简单的指针变量
数据类型 * 指针变量名;
int * p;//定义了一个指针变量 p
- 在 定义指针变量的时候 * 是用来修饰变量的,说明变量 p 是个指针变量。
- 变量名是 p
2.关于指针的运算符
-
&
运算符(取地址):&
运算符用于获取变量的内存地址。- 例如,如果我们有一个整数变量
x
,那么&x
就表示变量x
在内存中的地址。 - 这个地址可以被存储在指针变量中,以便后续访问。
-
*
运算符(取值):*
运算符用于解引用指针,获取指针所指向的数据。- 如果我们有一个指针变量
p
,那么*p
就表示获取指针p
所指向的数据。 - 例如,如果
p
指向整数变量x
,那么*p
就是获取x
的值。
int a =0x1234abcd;
int *p;//在定义指针变量的时候*代表修饰的意思,修饰 p 是个指针变量
p =&a;//把 a 的地址给 p 赋值,&是取地址符,
p 保存了 a 的地址,也可以说 p 指向了 a
p 和 a 的关系分析:a 的值是 0x1234abcd ,假如 a 的地址是:0xbf e8 98 68
分析:
- 1 、在调用的时候 *代表取值得意思 ,*p 就相当于 p 指向的变量,即 a,
- 2 、故 num=*p 和 num =a 的效果是一样的。
- 3 、所以说 num 的值为 0x1234abcd。
拓展 :如果在一行中定义多个指针变量,每个指针变量前面都需要加*来修饰
- int *p,*q;//定义了两个整型的指针变量 p 和 q
- int * p,q;//定义了一个整型指针变量 p ,和整型的变量 q
我们再看一下一个例子
int main(){
int a = 100, b = 200;
int *p_1,*p_2=&b;//表示该变量的类型是一个指针变量,
//指针变量名是 p_1 而不是*p_1. p_1 在定义的时候没有赋初值, p_2 赋了初值
p_1= &a;//p_1 先定义后赋值
printf("%d\n", b);
printf("%d\n",*p_2);
return 0;}
注意:
在定义 p_ 1 的时候,因为是个局部变量,局部变量没有赋初值,它的值是随机的,p_ 1 指向哪里不一定, 所以 p_ 1 就是个野指针。(野指针是指一个指针变量,它存储了一个无效的内存地址)
3.指针大小
在 32 位系统下 ,所有类型的指针都是 4 个字节 ,无论是字符指针还是数组指针还是啥啥啥指针,它们在内存中的大小都是一样的。听懂掌声。
4. 指针的分类
1:字符指针
字符型数据的地址
char *p;//定义了一个字符指针变量,只能存放字符型数据的地址编号
char ch; p= &ch;
2 :短整型指针
short int *p;//定义了一个短整型的指针变量 p ,只能存放短整型变量的地址
short int a; p =&a;
3 :整型指针
int *p;//定义了一个整型的指针变量 p ,只能存放整型变量的地址 int a;
p =&a;
注:多字节变量, 占多个存储单元,每个存储单元都有地址编号,
c 语言规定,存储单元编号最小的那个编号,是多字节变量的地址编号。
4 :长整型指针
long int *p;//定义了一个长整型的指针变量 p ,只能存放长整型变量的地址 long int a;
p =&a;
5 :float 型的指针
float *p;//定义了一个 float 型的指针变量 p ,只能存放 float 型变量的地址
float a; p =&a;
6 :double 型的指针
double *p;//定义了一个 double 型的指针变量 p ,只能存放 double 型变量的地址 double a;
p =&a;
7:函数指针:
函数指针就像是一个指向函数的箭头。
它可以让我们在程序运行时,根据需要调用不同的函数。
比如,我们可以把函数的地址存储在函数指针中,然后通过这个指针来调用函数。
8:结构体指针:
结构体是一种自定义的数据类型,可以包含多个不同类型的数据。
结构体指针就是指向结构体的箭头。
它可以让我们方便地访问结构体中的成员变量。
9:指针的指针:
指针的指针就像是一个指向指针的箭头。
它可以让我们间接地访问指针所指向的数据。
比如,我们可以有一个指向整数指针的指针,然后通过它来获取整数的值。
10:数组指针:
数组指针是指向数组的箭头。
它可以让我们方便地处理数组中的数据。
比如,我们可以用数组指针来遍历数组的元素。
11:通用指针 void*
:
void*
是一种特殊的指针,它可以指向任何类型的数据。
但是,我们不能直接访问它所指向的数据,需要先转换成具体的类型。
总结
今天就简单的讲解了一下指针最最浅显的东西,感觉全是废话。但是指针又太多了,打算一点一点的慢慢写。加油喽未来优秀的嵌入式工程师嘿嘿嘿。