1.定义
C语言中,为了方便的使用内存,提出了指针类型
首先来看看值传递的特点
看下图,定义了两个变量,其中将num1的值赋给了num2
#include <stdio.h>
void main() {
int num1=90;
int num2=num1;
printf("%d %d",num1,num2); //输出:90 90
printf("\n");
//%p是按16进制输出变量,&是获取变量的内存地址
printf("%p %p",&num1,&num2);//输出:0061FF1C 0061FF18
}
int num1=90:在内存中,给num1随机分配一个内存空间,内存地址为0061FF1C,值为90
int num2=num1:在内存中,给num1随机分配一个内存空间,内存地址为0061FF18,值为num1的值90
int num2=num1这种传递方式叫做值传递,两个变量都分配一个内存空间,并将值传递过去。修改num1的值不会影响num2。
但如果在函数传递时,基本类型如果传递指针,在函数修改时,也会直接修改这个指针变量指向的地址的值
指针类型:C语言中,任何数据类型,都有对应的指针类型
#include <stdio.h>
void main() {
//定义一个int类型的变量
int num=90;
//定义一个int类型对应的指针类型,格式为int num,或者int num
//int类型的变量只有int的指针才能接受,double 是不能接受的
//&num是使用num变量的内存地址,下列代码表示将num变量的内存地址赋给pre指针变量
int pre=#
//打印两个变量的内存地址,输出:0061FF18 0061FF1C
//表面上看是两个内存地址,但在内存中,看下图
printf("%p %p\n",&num,&pre);
}
pre指针变量的值,实际上存储的就是num1的内存地址
printf("%p",pre); //打印pre变量存放的地址:0061FF18
printf("%p",pre);//打印目标地址的值:90
修改num的值,会影响到pre指针变量,因为两个变量最终使用的内存地址是一样的
num=80;
printf("\n%d",pre);//打印:80
2.指针的运算操作
指针自增运算,++,--
一个数组在内存中是连续分布的
当对指针变量进行++操作时,指针的地址会按照它的数据类型的字节数递增
int arr[]={10,100,200};
int* ptr=arr; //此时,指针指向了数据中首个元素的内存地址
ptr++;
此时对指针执行自增操作,指针会按照数据类型进行自增,指针是int类型,c中的int类型字节数为4
那么:ptr++=0x1133+4=0x1137
此时指针就指向了数组中0x1137内存地址的元素
指针+-运算
指针+2
多级指针
指针作为形参时要注意的问题
函数返回值是指针时要注意的问题
空指针