【初阶指针之】指针和指针变量

首先我们要知道指针是什么?

指针理解的两个要点:

        1.指针是内存中一个最小单元的编号,也就是地址

        2.平时我们所说的指针,通常指的是指针变量,是用来存放地址的变量

总结:指针就是地址,口说的指针通常指指针变量


下面我们通过一串代码理解一下:

#include <stdio.h>

int main()
{
	int a = 10;
	char ch;
    //pa用来存放a的地址,pa也是一个变量,他也有一个地址
    //*只能表明pa是一个指针
	int * pa = &a;
	*pa = 20;//解引用操作符(间接访问操作符)
	printf("%d\n", a);
	char * pc = &ch;

	printf("%d\n", sizeof(pa));
	printf("%d\n", sizeof(pc));

	printf("%p\n",  &a);
	return 0;
}

通过调试可以发现,监视下的&a0x012FF840和内存中a的地址相等,ch同理

 运行该串代码,得到以下结果:

 

 1.通过*pa找到a,并将其值改为20;

2.运行发现,指针类型无论是int还是char,他的大小都是四个字节。这是因为指针大小在32位平台是四个字节,在64位平台是八个字节。此处运行结果是在32位平台运行

3.地址00EFFC7C是a的新地址,通过解引用操作,a的值被修改,地址也发生了变化


通过上述内容也可以发现,指针的大小一致,为何不用一个统一的字符来表示指针的类型呢?

下面我们来看一下,不同的指针类型,有何区别

#include<stdio.h>

int main() {
	int a = 0x11221122;

	/*int* pa = &a;
	*pa = 0;*/

	char* pc = &a;
	*pc = 0;
	return 0;
}

对pa进行操作:内存中a的四个字节全被改变

对pc进行操作:内存中a只有一个字节发生变化

 总结:

1.指针类型决定了:指针进行解引用操作的时候,访问几个字节(权限)。

 char*的指针解引用访问1个字节

int*的指针解引用访问4个字节

double*的指针,解引用访问8个字节

int main()
{
	int a = 0x11223344;
	int*  pa = &a;
	char* pc = &a;

	printf("pa=%p\n", pa);
	printf("pc=%p\n", pc);

	printf("pa+1=%p\n", pa -1);
	printf("pc+1=%p\n", pc -1);

	return 0;
}

总结:

 2.指针类型决定了指针的步长(向前/向后走一步都多大距离)int*指针+1(-1),意思是跳过一个整型,也就是向后(前)走4个字节
char*指针+1(-1),意思是跳过一个字符,也就是向后(前)走1个字节
double*的指针+1,意思是跳过一个double, 也就是向后走8个字节short* +1, 向后走2个字节


下面来简单测试一下,利用指针解引用对数组进行赋值:

int main()
{
	int arr[10] = { 0 };
	int* p = arr;//数组名就是数组首元素的地址arr->&arr[0];

	int i = 0;
	for (i = 0; i < 10; i++)//从数组下标为0依次赋值
	{
		*(p + i) = i + 1;
		printf("%d ", arr[i]);
	}

	//1~10
	//int i = 0;
	//for (i = 0; i < 10; i++)
	//{
	//	*p = i + 1;
	//	p++;
	//}
	return 0;
}


 本文章仅供参考,如有问题欢迎大家指正哦!!!

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值