C语言 指针

什么是内存?电脑上的存储设备,程序运行的时候会加载到内存中,使用内存空间

一个内存单元是一个字节,每个单元都有编号,内存单元的编号是地址,C语言中叫做指针

将存储在内存中的内容取出我们需要他的地址,用符号&。例如:int a =10,a是整型,占四个字节,&a取出的是其中呢一个字节呢?取出的是第一个字节的地址(较小的地址)。此时我们设置一个变量pa存放a的地址,pa叫做指针变量,用来存放地址(指针)

指针变量,用来存放地址(指针)

我们可以验证一下:

#include<stdio.h>
int main()
{
  int a=10;
int *pa=&a;
printf("%p\n",&a);
printf("%p\n",pa);
return 0;
}

打印出的结果&a(a的地址)与指针变量pa(存放地址的变量)相同,由此证明pa用来存放a的地址。

那我们如和打印出a的值呢?我们用到一个操作符,解引用操作符(*),*pa表示取出a的值,解引用以后直接打印a即可。

注意:内存单元的编号不是真实存在的,而是由电信号生成的,32位机器产生2的32次方个地址,即2的32次个字节=4GB.

指针变量是用来存放地址的,地址是唯一标识一个内存单元的,指针的大小在32bit机器上是4个字节,在64bit机器上是8个字节。

指针类型包括:

int*,short*,char*,float*,double*...

指针类型有意义,它决定了指针解引用操作一次性访问几个字节和步长。

#include<stdio.h>
int main()
{
  int a=0x11223344
  int*pa=&a;
  *pa=0;

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

二者解引用访问的字节不一样,前者访问4个字节,后者访问1个字节.

include<stdio.h>
int main()
{
  int a=10;
  int* pa=&a;
  cjar* pc=&c;
printf("%p\n",pa);
printf("%p\n",pa+1);

printf("%p\n",pc);
printf("%p\n",pc+1);
return 0;
}

结果可以看出前者跳过了4个字节,后者跳过了1个字节。

  1. 指针+- 整数

练习:利用指针打印一组数字 

#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	int* p = &arr[0];
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}
	return 0;

 定义一个叫做values的数组,数组有5个元素,设置一个指针变量vp,vp的起始位置是values[0],当vp<values[5]的时候,*vp++=0.后置++,先*vp,再++,由于是float* 类型,所以每次跳过一个字节,最终结果,values 5个元素都为0.

指针-指针

#include<stdio.h>

int main()

{
     int arr[10]={1,2,3,4,5,6,7,8,9,10};

      printf("%d\n",&arr[9]-&arr[0]);  //把它打印出来看看

      return 0;

}

结果是9,所以指针-指针的结果就是两个指针中间间隔元素个数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

看着不爽

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

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

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

打赏作者

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

抵扣说明:

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

余额充值