BSP学习 Day16 指针的分类 指针和变量的关系 什么是字节序 指针与数组元素之间的关系 指针的运算 指针数组和数组指针

目录

1.指针的分类

 2. 指针和变量的关系

3.什么是字节序

4.指针与数组元素之间的关系

5. 指针的运算

6. 指针数组和数组指针


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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕容离875

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值