初识c语言----指针(1)

一、指针

     我们知道计算机上CPU(中央处理器)在处理数据的时候,首先得从内存中获取所需的数据,读取之后,会重新把结果放回到内存之中。所谓内存,其实就是由许多个内存单元组成,每个内存单元的大小都是1个字节,即8个比特位(一个比特位可以存储一个二进制位的0或1)。

    由于内存中的字节很多,CPU若想访问内存中的某个字节空间,那必须得先知道这个字节空间在内存中所处的位置,于是便引入“编址”这个概念,编址其实就是通过硬件设计给每个内存单元进行编号,在计算机中我们把这个编号称为地址,而在c语言中,则被称为指针。

    所以,我们可以理解为:

内存单元的编号==地址==指针

二、&----取地址操作符

    我们知道在C语言中,变量的创建其实就是在内存中开辟出一块空间,下面列举几种变量类型所占的字节大小:

#include <stdio.h>
int main()
{
	printf("%zd\n", sizeof(char));  //1 
  	printf("%zd\n", sizeof(short));  //2
	printf("%zd\n", sizeof(int));    //4
	printf("%zd\n", sizeof(long));   //4
	printf("%zd\n", sizeof(long long));   //8
	printf("%zd\n", sizeof(float));    //4 
	printf("%zd\n", sizeof(double));   //8 
	printf("%zd\n", sizeof(long double));  //8
    //其中,sizeof() 是一种内存容量度量函数,返回一个变量或者类型的大小(以字节为单位)
    return 0;
}

    在创建变量时,内存会申请相对应类型字节大小的空间,每个字节都有与之对应的地址,那么在编程中,我们若想要直接获取这个地址,那么这时候就要用到取地址操作符----&

#include <studio.h>
int main()
{
	int a = 2;
	&a;
	printf("%p\n", &a);  //其中%p是专门用来打印地址的
	return 0;
}

    从上面的调试结果可以看到:虽然整型变量占用4个字节,我们只要知道了第一个字节地址,就可以顺藤摸瓜知道其他字节的数据。

三、指针变量

    我们通过取地址操作符(&)拿到的地址是一个数值,为了以后地址值的方便使用,我们可以把它存储在指针变量当中,指针变量顾名思义,就是用于存放指针的变量,即也是用来存放地址的。
​​​​​
#include <stdio.h>
int main()
{
	int a = 2;
	int* pa = &a;  //取出a的地址放到指针变量pa中

	char c = 'x';
	char* pc = &c;  //将c的地址放在指针变量pc中
	return 0;
}

    在上述代码中,其中pa的类型为int*,*是说明pa为指针变量,而前面int是在说明pa指向的是int类型的对象,同理,pc的类型为char*, *前面的char说明pc指的是char类型的对象。

    其中要注意的一点是:pa也是一个变量,是需要向内存中申请一块空间的,这样才有能力来存放地址。

四、解引用操作符(*)

    我们保存地址的目的就是为了方便使用,所以,我们只要拿到了地址(指针),就可以通过地址(指针)找到地址(指针)所指向的对象,这时就可以用到解引用操作符(*)

#include <stdio.h>

int main()
{
	int a = 3;
	int* pa = &a;
	printf("%d\n", a);

	*pa = 1;
	printf("%d\n", a);
	return 0;
}

    *pa 的意思就是通过pa中存放的地址找到相应的空间,也就是通过pa中存放的a的地址找到变量a,因此*pa其实就是a变量,所以*pa = 1,即把a改成了1。

五、指针变量的大小

    假设32位的机器有32根地址总线,每根地址线出来的电信号转换成数字信号后是1或者0,我们把这32个地址线转换的32位二进制数作为一个地址,则需要4个字节才能存储,那么一个指针变量也就需要4个字节的空间。同理64位机器,假设有64根地址线,一个地址就是由64个二进制位组成的二进制序列,存储起来就需要8个字节的空间,指针变量的大小就是8个字节。

#include <stdio.h>
//32位的平台
int main()
{
	printf("%zd\n", sizeof(char*));  //4
	printf("%zd\n", sizeof(short*));  //4
	printf("%zd\n", sizeof(int*));    //4
	printf("%zd\n", sizeof(long*));   //4
	printf("%zd\n", sizeof(float*));    //4 
	printf("%zd\n", sizeof(double*));   //4
	return 0;
}
#include <stdio.h>
//64位的平台
int main()
{
	printf("%zd\n", sizeof(char*));  //8
	printf("%zd\n", sizeof(short*));  //8
	printf("%zd\n", sizeof(int*));    //8
	printf("%zd\n", sizeof(long*));   //8
	printf("%zd\n", sizeof(float*));    //8
	printf("%zd\n", sizeof(double*));   //8
	return 0;
}

    因此,地址存放需要多大的空间,指针变量的大小就是多少,与其类型是无关的,在相同的平台下,指针变量的大小都是相同的。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值