2020.9.21 第9节 指针初识篇

文章目录

2020.9.21 第9节 指针初识篇

一、 指针初识

1.什么是指针:

地址:一个整数

如何获取地址:&

int iNum = 0;
	printf("%d\n", &iNum);
	printf("%x\n", &iNum);
	printf("%p\n", &iNum);
	printf("%p\n", &cNum);

2.什么是指针变量

存放地址的变量

用指针表示值
	int num = 1;
	printf("%d\n", *(&num));
	最常规的指针赋值
	int* pNum = #

3.指针的定义

3.1 方式:类型 *变量名

3.2 指针的类型:去掉变量名 int* char*…

3.2 指针指向的数据类型: 去掉变量名和* int char

本质是:指针变量要操作的地址的数据类型
指针的类型:int *
	指针所指向的类型:int
	易错的写法
	int *pp = NULL;
	pp才是指针 
	*pp是指针的使用
	*pp = #
	指针类型占用的字节数
	printf("%d\t%d\t%d\n", sizeof(int*), sizeof(char*), sizeof(float*));
	错误 0x00000000冲突
	int* pVoid = NULL;
	*pVoid = 1001;

4.指针如何表示数据

4.1 用变量地址赋值:地址

4.2 用:*地址:变量

pp才是指针 
	*pp是指针的使用

5.空类型的指针

不同类型指针的初始化 并不是真正的初始化

NULL —>(void *)0; //void * 类型

把0强制性转化成一个空类型的指针

/int* pVoid = NULL;
	//*pVoid = 1001;

二、 指针的运算

基本运算

1.取值:*地址

2. p+n 或者 p-n

int *p=NULL;
字节的偏移,不是数字上加减n
真正的字节数的偏移:
p+n p + sizeof (指针所指向的类型)*n int char… 32 64
p-n p - sizeof (指针所指向的类型)*n

3.不同类型指针变量减操作,无实际价值

int main() 
{
	int* pInt = NULL;
	char* pChar = NULL;
	printf("%p\n", pInt);
	printf("%p\n", pChar);
	printf("%p\n", pInt + 1);
	printf("%p\n", pChar + 1);
	int(*p)[3] = NULL;
	指针的类型  int(*)[3]   去掉指针名
	指针所指向类型 int[3]   去指针名和*  //int array[3] 占用12字节 
	printf("%p\n", p + 1);  //p+sizeof(所指向的类型)*1
	return 0;
}

三 、指针操作数组

一维数组:

数组名:表示整个数组占用的空间的首地址
int array[4]: array等效 &array[0]
#include <stdio.h>
int main() 
{
	int array[4] = { 1,2,3,4 };
	int* p = array;
	p = &array[0];
	for (int i = 0; i < 4; i++) 
	{
		//*(p+i) 等效p[i] 等效array[i]
		printf("%d\t", *(p + i));
		//printf("%d\t", p[i]);  和上面等效
	}
	//不正常的情况的
	//p[i] 等效*(p+i) 
	//指针操作数组,直接用指针名替换数组的名的用法
	p = &array[2];
	printf("\n%d\n", p[1]);  //*(&array[2]+1)
	printf("%d\n", *(&array[1] + 2));
	//输入的时候用用指针
	for (int i = 0; i < 3; i++)
	{
		scanf_s("%d", array + i);
	}
	int array2D[2][2] = { 1,2,3,4 };
	p = &array2D[0][0];
	for (int i = 0; i < 4; i++) 
	{
		printf("%d\t", p[i]);
	}
	printf("\n");
    return 0;
}

四、万能指针

万能指针: void * 类型的指针

1.万能指针可以操作任何类型指针

2.使用前必须强制类型

#include <stdio.h>
/*
	万能指针: void * 类型的指针
		1.万能指针可以操作任何类型指针
		2.使用前必须强制类型
*/
void* mytime()
{
	return NULL;
}
int main()
{
	int num = 0;
	void* pNum = &num;
	//使用的时候必须强制类型转换
	printf("%d\n", *(int*)pNum);
	char cNum = 'A';
	pNum = &cNum;
	int* p = (void*)mytime();
	printf("%c\n", *(char*)pNum);
	return 0;
}

五、多级指针

1.变量地址用指针变量存储

2.指针变量的地址用二级指针存储

#include <stdio.h>
int main() 
{
	//变量地址用指针变量存储
	int num = 0;
	int* p = &num;
	//指针变量的地址用二级指针存储
	int** pp = &p;
	printf("%d\n", **pp);

	//三级指针的存储
	int*** ppp = &pp;
	printf("%d\n", ***ppp);
	return 0;
}

六、 内存四区解决问题

1.堆区: 手动回收 动态内存申请的内存 手动申请,手动释放

2.栈区 : 局部变量,函数参数 自动释放,当使用完后系统会回收资源

栈结构: 先进后出 堆: 随机访问

3.静态区: 全局变量+静态变量 常量区: 不能改变

4.代码区: 写的代码编译后存储的位置 机器指令

#include <stdio.h>
//不能返回局部变量地址
//warning C4172: 返回局部变量或临时变量的地址: num
int* ReturnPoint() 
{
	int num = 1001;
	return &num;
}
int* returnNum(int a) 
{
	return &a;
}
//下个那个不算
int* returnMyNum(int *a) 
{
	return a;
}
int main() 
{
	//写入访问权限冲突
	char* p = "ILoveyou";   //不会修改,只做打印显示需求
	//*p = "I";    错误
	//*p = 'I';    错误
	//printf("%d\n", *p);
	char str[] = "ILoveyou";
	p = &str[0];
	//*(p+0)  p[0] str[0]
	*p = 'C';  
	printf("%s", p);
	int* pReturn = ReturnPoint();
	printf("\n第一次:%d\n", *pReturn);
	printf("第二次:%d\n", *pReturn);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值