零基础快乐学习C/C++——11

指针

指针是什么

指针是个变量,存放内存单元的地址(编号)
可以粗略理解为指针就是地址

int a = 10;
int* p = &a;

在32位的机器上,地址是32个二进制序列,所以地址就要用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节
同理,在64位的机器上,一个指针变量的大小是8个字节

指针和指针类型

我们知道变量有不同的数据类型,那指针有没有呢?

int main()
{
	printf("%d\n",sizeof(char*));
	printf("%d\n",sizeof(short*));
	printf("%d\n",sizeof(int*));
	printf("%d\n",sizeof(double*));
	return 0;
}

打印后可发现都是4个字节,既然指针大小一样了,为什么还要区分指针类型呢?

int a = 0x11223344;
int* pa = &a;
*pa = 0;
char* pc = &a;
*pc = 0;

经过内存监视窗口可以知道,两个指针类型不同,会导致解饮用操作的不同

指针类型意义1:
指针类型决定了指针进行解饮用操作的时候,能够访问空间的大小

int *p: *p能够访问4个字节
char *p:*p能够访问1个字节
double *p:*p能够访问8个字节

在这里插入图片描述
指针类型意义2:
指针类型决定了:指针走一步走多远(指针的步长

int* p :p+1—>4
char* p :p+1—>1
double* p:p---->8
在这里插入图片描述

野指针

野指针就是指针指向的位置是不可知的

野指针的成因

  1. 未初始化
  2. 越界访问
  3. 指针指向的空间释放
int a;//局部变量不初始化,默认是随机值
int* p;//局部的指针变量,就被初始化随机值
*p = 20;

如何避免野指针
在这里插入图片描述

指针运算

  1. 指针±整数
    在这里插入图片描述

  2. 指针-指针
    在这里插入图片描述
    结果是9,所以指针减去指针得到的指针和指针之间的元素个数

int my_strlen(char* str)
{
	char* start = str;
	char* end = str;
	while(*end != '\0')
	{
		end++;
	}
	return end - start;
}
int main()
{
	char arr[]= "welcome";
	int len = my_strlen(arr);
	printf("%d\n",len);

	return 0;
}
  1. 指针的关系运算

其实就是比较大小
在这里插入图片描述

指针和数组

要知道数组名是首元素的地址,只有两个例外,即

  1. &arr-----&数组名—此时的数据名不是首元素的地址,而是表示整个数组-----&数组名取出的是整个数组的地址
  2. sizeof(arr)----sizeof(数组名)表示的是整个数组----sizeof(数组名)计算的是整个数组的大小,单位是字节

在这里插入图片描述
输出发现值一样

二级指针

int a = 10;
int* pa = &a;
int* * ppa = &pa;//ppa就是二级指针

在这里插入图片描述

指针数组

存放指针的数组

int a = 10;
int b = 20;
int c = 30;

int* arr2[3]={&a,&b,&c};//指针数组
int i = 0;
for(i = 0;i<3;i++)
{
	printf("%d",*(arr2[i]));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值