聊聊C指针

一句话总结:指针就是内存单元的编号。

1. 内存单元

在计算机中,所有数据皆由二进制数字0和1组成。

存一个0或者一个1的空间称作一个二进制位或者一个比特(由bit这个单词音译而来,bit全称为binary digit 或者 binary unit)

我们将八个二进制位作一个单位,这一个单位就叫做字节。

没错,一个字节等于八个二进制位,八个二进制位为一个字节。

在内存世界中,字节还有另外一种称呼,即内存单元。

内存世界中的一个字节就是一个内存单元,一个内存单元就是一个字节。

2. 内存单元如何区分

内存世界以内存单元(8个二进制位、一个字节)为基础单位,从0开始编号,编号最大到哪,那得看内存世界的大小,是4G、8G、16G或更大的G。

内存世界用内存单元的编号来标识内存单元,内存单元的编号,又被称作内存地址。

下面有个示意图,简单感受一下。每八个二进制位就是一个内存单元,每个内存单元都会有个编号,编号从0开始。图中每八个二进制位用不同的色彩进行区分。

清楚了上述内容,指针就不在话下了。

3. 认识指针

指针就是内存单元的编号,就是内存单元的地址。

4. 指针用来干什么

指针用作空间转移。比如你在100号内存单元,该内存单元里存储着38号内存单元的指针(就是38,不过以二进制的形式体现),那么你就可以去38号内存单元,并读取出其内容。

 代码展现:

#include<stdio.h>

int main(int argc,char * argv[])
{
    char love='S';//这里的变量love相当于38号内存单元
    char * p=&love;//这里的指针变量P相当于100号内存单元

    puts("我们看看p这个字符指针变量里存了什么东西");
    printf("p=\t%p\n",p);

    puts("我们看看字符变量love的内存指针");
    printf("&love\t%p\n",&love);

    puts("原来,字符指针变量p\t里面存放的是\t字符变量love的指针\n");

    puts("通过变量名love访问字符变量love");
    printf("love=\t%c\n",love);

    puts("通过字符指针变量p访问字符变量love");
    printf("*p=\t%c\n",*p);
    puts("原来访问某个变量,除了自身的变量名外,还可以通过指针变量去访问它");
}

5.指针的简单使用

后面以字符指针变量为例,为大家演示指针的使用

这里一定要弄清楚指针和指针变量

指针:内存单元的地址,内存单元的编号

指针变量:存储内存单元地址的变量,存储内存单元编号的变量

5.1声明指针变量

#include <stdio.h>

int main(int argc,char * argv[])
{
    //声明一个指针变量,以字符指针变量为例
    char * p1;

    return 0;
}

5.2为指针变量赋值

#include <stdio.h>


int main(int argc,char * argv[])
{
    //声明一个指针变量,以字符指针变量为例
    char * p1;
    //定义一个字符变量
    char k='Y';
    //为指针变量p1赋值  &k是取出k所在空间的指针
    p1=&k;
    //输出字符指针变量中的值
    printf("p1= %p\n",p1);

    
    return 0;
}

5.3通过指针变量读取其所指向变量的值

#include<stdio.h>

int main(int argc,char * argv[])
{
	//声明一个指针变量,以字符指针变量为例 
	char * p;
	//定义一个字符变量
	char k='Y';
	//为指针变量p赋值  &k是取出k所在空间的指针
	p=&k;
	//输出字符指针变量中的值
	printf("p= %p\n",p);
	//通过指针变量p访问字符变量k ,*p 表示从自身的空间转移到 k 所在的空间,就可以访问变量k
    //下面将输出 Y
	printf("k= %c\n",*p);
	
	
	return 0;
}

5.4通过指针变量修改其所指向变量的值

#include<stdio.h>

int main(int argc,char * argv[])
{
	//声明一个指针变量,以字符指针变量为例 
	char * p;
	//定义一个字符变量
	char k='Y';
	//为指针变量p赋值  &k是取出k所在空间的指针
	p=&k;
	//输出字符指针变量中的值
	printf("p= %p\n",p);
	//通过指针变量p访问字符变量k 
	//*p 表示从自身的空间转移到 k 所在的空间,就可以访问变量k的值
    //下面将输出 Y
	printf("k= %c\n",*p);
	
	//通过指针变量修改字符变量k的值
	*p='L';
	//此时k的值应为 L
	printf("k= %c\n",k);
	
	return 0;
}

5.5 指针变量在内存中所占的大小

这里让代码说话吧!

代码:

#include <stdio.h>

//结构体student
struct student {
    char identity[32];
    char name[16];
    int gender;
    int age;
};

int main(int argc, char *argv[]) {
    //声明基本数据类型的指针变量
    char * char_pointer;
    short * short_pointer;
    int * int_pointer;
    long * long_pointer;
    float * float_pointer;
    double * double_pointer;
//声明结构体类型的指针变量
    struct student * student_pointer;
//输出每种指针变量所占空间的大小
    printf("sizeof(char_pointer)= %d\n",sizeof(char_pointer));
    printf("sizeof(short_pointer)= %d\n",sizeof(short_pointer));
    printf("sizeof(int_pointer)= %d\n",sizeof(int_pointer));
    printf("sizeof(long_pointer)= %d\n",sizeof(long_pointer));
    printf("sizeof(float_pointer)= %d\n",sizeof(float_pointer));
    printf("sizeof(double_pointer)= %d\n",sizeof(double_pointer));
    printf("sizeof(student_pointer)= %d\n",sizeof(student_pointer));


    return 0;
}

运行展示:

 由运行结果可知:任何类型的指针变量,均占8个字节。

6.总结

抛开语言来说,指针就是内存单元的地址,就是内存单元的编号。有了指针,我们就可以通过C语言这个工具去访问指定内存单元,修改指定内存单元的值。由于指针存储于指针变量当中,就可以由指针变量作空间转移。例如:char x='L'; char * p=&x;我们就可以通过指针变量p转移到变量x的空间,具体做法是在指针变量p前面加上*,*p就完成了一次空间转移。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值