指针学习(2)

本文是关于C语言指针的学习笔记,涵盖了类型转换、&符号的使用、指针操作数组以及指针的特征探测。讨论了如何通过*获取指针所指向的值,以及如何用指针操作数组,包括反汇编分析和练习问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0x 00、前言

自己对视频的理解,小白一枚,如有错误,欢迎指出,感谢

0x 01、类型转换

char a;
int b;
a = 10;
b = (int)a;

上述是强制类型转换的写法,但char和int其实不需要。
结构体不行,因为结构体中定义的不知道是转哪个,但是指针可以

struct Student
{
	int level;
	int age;
};
void Test()
{
	int x;
	x = 10;
	y = (Student)x; 
}

0x 02、&符号的使用

&是地址符,类型是其后面的类型加一个 “*”,任何变量都可以使用&来获取地址,但不能用于常量

#include "stdafx.h"
int main()
{
	char a = 10;	
	short b = 20;	
	int c = 30;	
	char pa = &a;
	short pb = &b;
	int c = &c;
	
	//&a 是什么类型?	
	//&b 是什么类型?	
	//&c 是什么类型?	

	return 0;
}

这是个错误代码,错误如下,应该是char *、short *、int *
在这里插入图片描述
注:上篇文章说指针都要写全部的语法,但是&a等是知道了类型的,所以可以舍去,写为简写

0x 03、“带*类型” 的特征探测:求值

#include "stdafx.h"
int main()
{
	int* px;	
	
	int** px2;	
	
	int*** px3;	
	
	int**** px4;	
	
	//*(px) 是什么类型?	
	
	//*(px2) 是什么类型?	
 	
	//*(px3) 是什么类型?	
	
	//*(px4) 是什么类型?
	
	int x = *(px);
	int* x2 = *(px2);	
	int** x3 = *(px3);
	int*** x4 = *(px4);
	return 0;
}

成功运行,说明*(px)等的类型是其原来的类型舍去一个*,与&相反

#include "stdafx.h"
int main(int argc, char* argv[])
{
	int x,y;	
	int* px;	
	int** px2;	
	int*** px3;	
		
	x = 10;	
	px = &x;	
	px2 = &px;	
	px3 = &px2;	
	
	y = *(*(*(px3)));	

	
	return 0;
}

下图是其反汇编
在这里插入图片描述
总结:
1、带 * 类型的变量,可以通过在其变量前加 * 来获取其指向内存中存储的值
2、在带 * 类型的变量前面加 * ,其类型是其原来的类型减去一个 *

0x 04、用指针操作数组

通过之前学习的知识来解释为什么可以这样写?

#include "stdafx.h"
int main(int argc, char* argv[])
{
	char arr[10];			
			
	//char* p = &arr[0]; //取数组第一个元素的地址			
	//char* p2 = arr;    //简写			
	
	char* p = arr;			
			
	for(int i=0;i<10;i++)			
	{			
		*(p+i) = i*2;		
	}			
			
	for(int k=0;k<10;k++)			
	{			
		printf("%d\n",*(p+k));		
	}			

	return 0;
}

首先,简写形式,然后第一个 * 加变量是给数组地址中的值赋值,之后再打印出数组地址中的值

总结:
1、%arr[0]代表去数组中第一个元素的地址,可以省略为数组名
2、*(p+i) = p[i]

0x05、练习

1、列出每一行的反汇编代码:

char a = 10;		
short b = 20;		
int c = 30;		
		
char* pa = &a;		
short* pb = &b;		
int* pc = &c;		
		
char** ppa = &pa;		
short** ppb = &pb;		
int** ppc = &pc;	

在这里插入图片描述
第一部分就是先存值
第二、三部分取地址

2、列出每一行的反汇编代码:

int p = 10;		
		
int******* p7;		
int****** p6;		
int***** p5;		
int**** p4;		
int*** p3;		
int** p2;		
int* p1;		
		
p1 = &p;		
p2 = &p1;		
p3 = &p2;		
p4 = &p3;		
p5 = &p4;		
p6 = &p5;		
p7 = &p6;	

在这里插入图片描述
3、被省略0.0
4、完成代码,实现数组值的互换

void Function()					
{					
	int arr[5] = {1,2,3,4,5};				
					
	//..此处添加代码,使用指针,将数组的值倒置				
					
	//打印数组值的代码已经写完,不需要修改				
	for(int k=0;k<5;k++)				
	{				
		printf("%d\n",*(p+k));			
	}				
					
}

答案:
还需再想想,没有完全用指针,中间有错误

#include "stdafx.h"

void Function()
{
	int arr[5] = {1,2,3,4,5};
	int* p = &arr[0];

	int x = arr[0];
	int y = arr[1];
	arr[0] = (int)*(p+4);
	arr[1] = (int)*(p+3);
	arr[3] = (int) y;
	arr[4] = (int) x;
	
			
	

	for(int k=0;k<5;k++)
	{
		printf("%d\n",*(p+k));
	}
}
int main(int argc, char* argv[])
{
	Function();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值