指针
指针简介
指针就是存放一个变量的地址的变量,说白了指针就是存放地址的,但指针很神奇可以直接访问内存,编译器通过获得指针即变量的地址就可以改变变量的值(是不是很神奇)
指针变量的声明
基类型 * 指针变量名=一个地址(初始化)
如果定义了指针变量但没有初始化,那该指针就会成为野指针,因为指针可以直接访问内存,野指针会指向你不知道的内存中这样可能会使你的系统崩溃,所以最好不要出现野指针,如果指针没有值就赋为空
int * p = NULL://表示p是一个空指针
两个神奇的运算符 &,*
取地址符:& 取变量的地址,内存空间是很大的编译器只有通过获得变量的地址,才能对该变量进行操作
解引用运算符: 引用这个指针指向变量的值*
#include <stdio.h>
int main()
{
int a= 10;
int * str;
str = &a;
printf("a = %d\n",*str);
}
指针的进阶
指针与函数
**为啥要把指针·与函数结合?
当你的自定义函数有多个返回值的时候return就不适用了return只能返回1个值,所以只有指针可以做到
以让两个数从大到小的顺序排序为例
**
#include <stdio.h>
void str(int *x,int *y);//让最大的值排在前面
int main()
{
int a,b;
int *p1 = NULL,*p2 = NULL;
scanf("%d %d",&a,&b);
p1 = &a;
p2 = &b;
if(a < b)
{
str(p1,p2);
}
else
{
printf("%d %d\n",a,b);
printf("%d %d\n",*p1,*p2);
}
}
void str(int *x,int *y)
{
int i;
i = *x;
*x = *y;
*y = i;
}
//指针函数和函数指针
//指针函数是带指针返回值的函数
//函数指针是指向函数的指针变量
函数指针
#include <stdio.h>
int (*p)(int x,int y);
int fun(int x,int y,int (*p)(int x,int y));
int max(int x,int y);
int main()
{
int a,b;
printf("请输入两个数:");
scanf("%d %d",&a,&b);
fun(a,b,max);
}
int fun(int x,int y,int (*p)(int,int))
{
int z;
z = (*p)(x,y);
printf("%d",z);
}
int max(int x,int y)
{
int z;
if(x > y)
{
z = x;
}
else
{
z = y;
}
return z;
}
//函数名就是函数的入口地址,只要有函数的入口地址就可以指向函数
我们来分析一下,首先把a,b的地址赋给p1,p2;,在判断如果符合if就调用str()自定义函数,通过交换两个变量的值,来改变主函数a,b的值这就牵扯到了传值和传址的问题:传值就是把实参的值的副本传给形参,形参的改变不会影响实参。传址就不同了,通过操作指针实参的值可能改变
指针与数组
以计算10个数字之和为例
#include <stdio.h>
int main()
{
int num = 0;
int a[10];
int *p = NULL;
p = a;
for(p = a;p < a + 10;p ++)
{
scanf("%d",p);
num = num + *p;
}
printf("%d",num);
}
c语言规定数组名就是数组的地址所以 p = a;
P++;指针移动,指针移动的字节取决于数组的数据类型