目录
指针的定义:
c语言中的指针是一种变量,它储存的是另一变量的地址。指针的类型需要与说指向的变量类型相同。
指针的运算符:
1、取地址操作符&:用于获取变量的地址
2、间接寻址或指针增量运算符 *:用于获取存储在指针指向地址的值。
# include<stdio.h>
int main(){
int a;
a=56;
int *p=&a;
printf("p指向的地址=%d\n",p);
printf("a的地址=%d\n",&a);
printf("%d %d",*p,a);
return 0;
}
指针的级别:
int *是一级指针,int **是二级指针也称为指针的指针,int ***是三级指针
#include<stdio.h>
int main(){
int a=90;
int *p=&a; //p是一个指针,指向的内容是int型,指向的内容为a的值90
int **p1=&p; //**p是二级指针,代表p1指向的是p指向的空间 ,也就是a的空间
int ***p2=&p1; //***p是三级指针,代表p2指向的是p1的空间,p1又指向p,p指向a的空间
printf("%d %d %d %d",a,*p,**p1,***p2) ;
printf("\n");
printf("%d %d %d %d",&a,p,p1,p2);
return 0;
}
指针的运算:
1、指针的加减法(包含自增,自减):指针向前或者向后移动指定的数量
#include<stdio.h>
int main() {
int arr[4]={3,2,8,5};
int *p=&arr[2];
printf("%d\n",*p);
p+=1; //p++
printf("%d\n",*p);
p-=2;
printf("%d\n",*p);
return 0;
}
2、指针-指针:指的是两个指针之间的个数
#include<stdio.h>
int main() {
int arr[4]={3,2,8,5};
int *p=&arr[0];
int *q=&arr[2];
int a=q-p; //两个指针指向的是同一空间
printf("%d",a);
return 0;
}
3、指针关系运算:比较指针大小
指针比较 | 含义 |
ptr1==ptr2 | 比较两个指针地址是否相同 |
ptr1!=ptr2 | 比较两个指针地址是否不相等 |
ptr1<ptr2 | 比较指针的大小,通常用于有序的内存区间 |
........ | ....... |
指针数组与数组指针:
1、指针数组:存放指针元素的数组,有多个指针元素组成,每个元素指向不同的数据。指针数组用于多个场合,比如,储存函数指针,动态数据结构(链表……)、多维数组操作等
#include<stdio.h>
int main(){
int a=11;
int b=45;
int c=88;
int *arr[3]={&a,&b,&c}; //定义一个指针数组
printf("%d,%d,%d\n",*arr[0],*arr[1],*arr[2]);
int p1[]={23,78,90};
int p2[]={55,89,33};
int *ptr[]={p1,p2};
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
printf("%d\t",*(ptr[i]+j));
}
}
return 0;
}
使用指针数组的时候需要注意的是内存管理和指针的正确性,避免出现野指针或者内存泄露等问题。
#include<stdio.h>
#define Nb 10
int main(){
int nums[Nb]={56,89,44,23,12,11,99,86,45,37};
int (*ptr)[Nb]=&nums; //ptr是一个指向nums数组的指针
for(int i=0;i<10;i++){
printf("%d ",(*ptr)[i]); //访问数组元素
}
return 0;
}
函数指针:
它允许我们存储一个函数的地址,并通过这个地址调用这个函数。
#include<stdio.h>
//定义一个函数类型,接受两个int类型的参数,并返回int类型
typedef int (*Myptr)(int,int);
int max(int x,int y){
if(x>y)
return x;
else return y;
}
int main(){
//定义一个函数指针,指向max函数
Myptr ptr1=&max;
//通过函数指针的调用max函数
int num=ptr1(88,12) ;
printf("%d\n",num);
return 0;
}
函数指针数组
#include<stdio.h>
int add(int x,int y) {
return x+y;
}
int mult(int x,int y){
return x*y;
}
int main(){
int a,b;
printf("请输入两个数:");
scanf("%d %d",&a,&b) ;
int (*nums[])(int,int)={add,mult};
int res1=nums[0](a,b);
int res2=nums[1](a,b);
printf("%d %d",res1,res2);
return 0;
}
野指针:
未被初始化的指针,如果指针未被赋予一个有效的地址,他可能会指向任意的内存位置
#include<stdio.h>
//野指针
int main(){
int *ptr; //声明指针,但未初始化
*ptr=10; //ptr指向的内存区域是未知的
return 0;
}
为避免野指针,可以使用指针前初始化