关于指针那些事

一、内存必知

外存
        外存又叫外部存储器,长期存放数据,掉电不丢失数据
常见的外存设备:硬盘、flash、rom、u盘、光盘、磁带
内存
        内存又叫内部存储器,暂时存放数据,掉电数据丢失
常见的内存设备:ram、DDR

在运行程序的时候,操作系统会将 虚拟内存进行分区。
1.堆
在动态申请内存的时候,在堆里开辟内存。
2.栈
        主要存放局部变量(在函数内部,或复合语句内部定义的变量)。
3.静态全局区
        1):未初始化的静态全局区
        静态变量(定义的时候,前面加static修饰),或全局变量 ,没有初始化的,存在此区
        2):初始化的静态全局区
        全局变量、静态变量,赋过初值的,存放在此区
4.代码区
        存放咱们的程序代码
5.文字常量区
        存放常量的。
        内存以字节为单位来存储数据的,咱们可以将程序中的虚拟寻址空间,看成一个很大的一维的字符数组

二、指针的定义方法

1.简单的指针
 

//定义一个普通变量
int a = 100;
//定义一个指针变量
 int *p;
//给指针变量赋值,将a的地址保存在p中
p = &a;

2.关于指针的运算符

&:获取一个变量的地址
*:在定义一个指针变量时,起到标识作用,标识定义的是一个指针变量
除此之外其他地方都表示获取一个指针变量保存的地址里面的内容

&p 取指针p的地址 、 *p取指针p的值、 p取变量a的地址

3.指针的大小

在32位系统下,所有类型的指针都是4个字节
因为不管地址内的空间多大,但是地址编号的长度是一样的,所以在32位操作系统中,地
址都是四个字节

三、指针与变量的关系

        1:*+指针 取值,取几个字节,由指针类型决定的指针为字符指针则取一个字节,指针为整型指针则取4个字节,指针为double型指针则取8个字节。
        2:指针++ 指向下个对应类型的数据
        字符指针++ ,指向下个字符数据,指针存放的地址编号加1
        整型指针++,指向下个整型数据,指针存放的地址编号加4

四、指针与数组的关系

1、指针和数组的关系
        指针可以保存数组元素的地址
        可以定义一个数组,数组中有若干个相同类型指针变量,这个数组被称为指针数组
2、指针数组的概念:
        指针数组本身是个数组,是个指针数组,是若干个相同类型的指针变量构成的集合
        注意:一般遇到这样的叠词,本质就是后者

3、定义方法:

int * p[10];//定义了一个整型的指针数组p,有10个元素p[0]~p[9],每个元素都是int*类型的变量
int  a;
p[1]=&a;
int b[10];
p[2]=&b[3];
//p[2]、*(p+2)是等价的,都是指针数组中的第2个元素。

五、指针的运算

1.只有两个相同类型的指针指向同一个数组的元素的时候,比较大小才有意义
指向前面元素的指针 小于 指向后面 元素的指针

2.必须是两个相同类型的指针指向同一个数组的元素的时候,做减法才有意义
做减法的结果是,两个指针指向的中间有多少个元素

3.只有相同类型的指针才可以相互赋值(void *类型的除外)

六、多级指针

int a;
int *p;
p=&a;
*p  === a//一级指针表变量地址
int **q;
q=&p;
*q === p
**q === *p === a//二级指针表一级指针的地址
int ***m;
m=&q;
*(*(*m)) === a//三级级指针表二级指针的地址

七、字符串和指针
字符串的概念:
        字符串就是以’\0’结尾的若干的字符的集合
        字符串的存储形式: 数组、字符串指针、堆
1、 char string[100] = “I love C!”
        定义了一个字符数组string,用来存放多个字符,并且用”I love C!”给string数组初始化,字符串“I love C!”存放在string中
2、 char *str = “I love C!”
        定义了一个指针变量str,只能存放字符地址编号,所以说I love C! 这个字符串中的字符不能存放在str指针变量中。str只是存放了字符I的地址编号,“I love C!”存放在文字常量区
3、 char *str =(char*)malloc(10*sizeof(char));
        动态申请了10个字节的存储空间,首地址给str赋值。 strcpy(str,"I love C");//将字符串“Ilove C!”拷贝到str指向的内存里

八、数组指针

(1)、一维数组指针,加1后指向下个一维数组
        int(*p)[5] ;

二维数组指针,加1后指向下个二维数组
        int(*p)[4][5];

九、指针与函数的关系

1.函数的传参方式:复制传参、地址传参、全局传参(较少用到)

2.如果实参是一个普通变量,地址传参的话就需要形参是一级指针,
   如果实参是一个一级指针,地址传参的话就需要形参是一个二级指针。

十、容易混淆的内容
指针数组:是个数组,有若干个相同类型的指针构成的集合
        int *p[10];
        数组p有10个int *类型的指针变量构成,分别是p[0] ~p[9]

数组指针:本身是个指针,指向一个数组,加1跳一个数组
        int (*p)[10];
        P是个指针,p是个数组指针,p加1指向下个数组,跳10个整形。

指针的指针:
        int **p;//p是指针的指针
        int *q;
        p=&q;

容易混淆的指针
        第一组:
        1、 int *a[10];
                这是个指针数组,数组a中有10个整型的指针变量
                a[0]~a[9]
        2、int (*a)[10];
                数组指针变量,它是个指针变量。它占4个字节,存地址编号。
                它指向一个数组,它加1的话,指向下个数组。
        3、 int **p;     
                这个是个指针的指针,保存指针变量的地址。
                它经常用在保存指针的地址:
常见用法1:
        int **p
        int *q;
        p=&q;
常见用法2:
        int **p;
        int *q[10];
        分析:q是指针数组的名字,是指针数组的首地址,是q[0]的地址。
        q[0]是个int *类型的指针。  所以q[0]指针变量的地址,是int **类型的
第二组:
        1、int *f(void);
                注意:*f没有用括号括起来
                它是个函数的声明,声明的这个函数返回值为int *类型的。
        2、int (*f)(void);
                注意*f用括号括起来了,*修饰f说明,f是个指针变量。
                f是个函数指针变量,存放函数的地址,它指向的函数,
                必须有一个int型的返回值,没有参数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值