目录
1.指针的分类
按照指针指向的数据类型进行分类
可分为字符型指针、短整型指针、整形指针、长整型指针、浮点型指针、double型指针
char ch = 'y';
char *pch = &ch;//字符型指针
short s = 10;
short *ps = &s;//短型指针
int a = 10;
int *pa = &a;//整型指针
long long l = 10;
long long *pl = &l;//长整型指针
float f = 10;
float *pf = &f;//浮点型指针
double d = 10;
double *pd = &d; //double型指针
函数指针:(本质是一个指针,指向一个函数的指针)
指针函数:(本质是一个函数,函数的返回值是一个指针)
结构体指针:(本质是指针,指向一个结构体的指针)
指针的指针:(指向指针的指针,二级指针)
数组指针:(本质是一个指针,表示指向数组的指针)
指针数组:(本质还是一个数组,数组中的每个元素都是一个指针)
无论什么类型的指针变量,在32位系统下都是4字节,只能存放对应类型的变量的地址编号。
2. 指针和变量的关系
指针可以存放变量的地址编号
1.直接通过变量的名称
int a;
a = 100;
printf("%d",a);
2.通过指针变量来引用变量
之前有个交换两个数字的案例,异或,借助中间变量等手段都无法进行两个数的交换,今天通过指针的知识,可以解决此类问题,代码如下:
#include<stdio.h>
int swap(int *pa,int *pb);
int main()
{
int a = 10;
int b = 20;
printf("交换前%d,%d\n",a,b);
swap(&a,&b);
printf("交换后%d,%d\n",a,b);
return 0;
}
int swap(int *pa,int *pb)
{
int temp;
temp = *pa;
*pa = *pb;
*pb = temp;
return 0;
}
3.什么是字节序
端序或则尾序,在计算机领域中,指电脑内存中或在数字通信链路中,占多个字节的数据的字节排序顺序。
字节的排列方式有两个通用规则:大端序
(Big-endian)和小端序
(Little-endian)
- Big-endian:高位字节存入低地址,低位字节存入高地址
- Little-endian:低位字节存入低地址,高位字节存入高地址
代码演示实现
#include<stdio.h>
int main()
{
int a = 0x12345678;
int b = 0x78563412;
short *pa, *pb;
pa = (short *)&a;
pb = (short *)&b;
printf("%p, %p\n", &pa, &pb);
printf("%x, %x\n", *pa, *pb);
*pa++;
*pb++;
printf("%p, %p\n", &pa, &pb);
printf("%x, %x\n", *pa, *pb);
return 0;
}
注:
*p的取值,由指针类型所决定,例如字符型就是一个字节
p++指向下一个对应类型的数据
4.指针与数组元素之间的关系
1.数组名【下标】
int a[10];
a[2] = 100;
2.指针名【下标】
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int *p;
char *pch;
p = a; //数组名可以代表数组的首地址printf("%d\n",a[i]);
printf("%d\n",p[i]); //通过指针访问数组中的每个元素
printf("%d\n",*(a+i)); //a+i等价于a[i]的地址
printf("%d\n",*(p+i));//p++向后移了4个字节,p+i就移了i*4个字节,即移了i个元素的地址
printf("%p\n",&a[i]);
printf("%p\n",&p[i]);
printf("%p\n",a+i);
printf("%p\n",p+i);
练习:通过swap函数和指针,将输入的三个数,从小到大输出
#include<stdio.h>
float swap(float *pa, float *pb)
{
float temp;
temp = *pa;
*pa = *pb;
*pb = temp;
return 0;
}
int main()
{
float a[3];
printf("请输入三个小数:\n");
float *p = a;
for(int i = 0; i < 3; i++)
{
scanf("%f", &a[i]);
}
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
if(p[i] < p[j])
{
swap(&p[i], &p[j]);
}
}
}
printf("a = %.1f, b = %.1f, c = %.1f\n", p[0], p[1], p[2]);
return 0;
}
5. 指针的运算
1.指针是可以加一个整数的,意为指向这个整数后的元素,结果还是个地址变量
2.两个相同类型的指针可以比较大小<指向同一个数组的元素时>
3.两个相同类型的指针可以做减法<指向同一个数组的元素时>
4.两个相同类型的指针可以做赋值运算(相同类型才可以,void *类型除外)
6. 指针数组和数组指针
- 指针数组
一个存放指针的数组,其实可以用来和一个数组一一对应,然后用指针来操作数组
#include<stdio.h>
int main()
{
int *arr[5] = {NULL};
int brr[5] = {1, 2, 3, 4, 5};
for(int i = 0; i < 5; i++)
{
arr[i] = &brr[i];
printf("%p\n", arr[i]);
printf("%d\n", *arr[i]);
}
return 0;
- 数组指针
本质上是一个指针,他可以指向一个二维数组,他后面跟的是这个二维数组的列,行是根据这个二维数组的变化而变化
#include<stdio.h>
int main()
{
//数组指针,指向一个数组的指针
int (*parr)[5] = {0};
int arr[3][5] = {{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10},
{11, 12, 13, 14, 15}};
parr = arr;
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 5; j++)
{
printf("%d ", parr[i][j]);
}
printf("\n");
}
return 0;
}