C语言基础——指针2

二级指针

一级指针存放普通变量的地址
二级指针存放一级指针的地址
格式:存储类型 数据类型 **指针变量名
int a=8;
int *p=&a;
int ** q=&p; //二级指针用 ** 定义,指向指针p的地址
问题:
访问a的值:a *p **q
访问a的地址:&a p *q
访问p的地址:q &p
递推式: q=&p–> * q= * &p=p=&a–> ** q= * p= * &a=a

指针和数组

指针和一维数组

直接访问:通过数组名
间接访问:通过指针
int a[]={2,3,4,5,6};
int *p=a;
直接访问
在这里插入图片描述
间接访问
在这里插入图片描述
虽然访问形式相似,但两者不同
a和p本质不同:a是地址常量,不能被赋值;p是指针变量,可以被重新赋值

指针运算

运算方法
1)*和 ++都是单目运算符,优先级相同
2)单目运算符从右向左运算
例子:
(*p)++:先算(*p)==取内容,对内容++
p++:先算p++,由于++在后,对p取,最后再p++
*(p++)::同上
++p:先算p得到内容,再去 ++内容
++(*p):同上
*++p:先算++p,由于++在前,p先自加,对自加后的地址取内容
*(++p):同上
补充(通过指针储存字符串首地址,实现字符串的储存)
char *p=“hello”;
//p在栈区开辟4字节的空间存放字符串常量"hello"的首地址
//"hello"存放在常量区

二维数组

二维数组数组名表示第一行的首地址
int a[2][3]={2,3,4,5};//a:第一行的首地址 a+1:第二行的首地址
a是行地址,如果想访问其中的列(行地址和列地址级别不同,一行可以有多列),需要对他降级处理加*

a: 第一行的首地址
a+1: 第二行的首地址
*a: 第一行第一列的地址
表格展示
在这里插入图片描述**这里注意a表示首地址,a也表示首地址(表示降级处理而不是取值符),所以取值要再加 * , ** a

数组指针

本质是指针,指向数组
格式:存储类型 数据类型 (*指针变量名)[列数]
int a[2][3]={2,3,4,5,6,7};
int ( * p)[3]=a;

在这里插入图片描述
数组指针的大小:
printf(“%d\n”,sizeof ( p)); //4,数组指针本质还是指针,32位系统下,就是4个字节

指针数组

本质是数组,里边存放地址
格式:存储类型 数据类型 *数组名[元素个数]
int a=3,b=5,c=9;
int *p[3]={&a,&b,&c};
p[0]—>&a
p[1]—>&b
p[2]—>&c
访问b的值:
*p[1] //p[1]访问指针数组的第二个元素,但是第二个元素是个地址, * p[1]
| * ( * (p+1)) //p+1访问的数组第二个元素的地址 *(p+1)取第二个元素的内容==&b; * ( * (p+1))
访问b的地址:
p[1] * (p+1)

存放二维数组每一行第一列的地址

int a[3][4]={2,3,4,5,6,7,8,9};
int * p[3]={a[0],a[1],a[2]};
访问a[1][2]的值:
* (p[1]+2) p[1]访问数组中第二个元素(第二行第一列的地址),p[1]+2找到第二行第三列的地址,(p[1]+2)
* ( * (p+1)+2) //p+1找到数组中第二个元素的地址(a[1]的地址),
(p+1)==第二行第一列的地址, *(p+1)+2 == 第二行第三列的地址, * ( *(p+1)+2)
访问a[1][2]的地址:
p[1]+2
*(p+1)+2
printf(“%d\n”,sizeof ( p)); //12 3个指针

存放字符串

char * p[3]={“hello”,“world”,“hqyj”};
打印world
printf(“%s\n”,p[1]);
printf(“%s\n”,*(p+1));
打印’d’
*(p[1]+4)
* ( *(p+1)+4) p+1找到数组中第二个元素的地址, *(p+1)取数组中第二个元素的内容(world的首地址), *(p+1)+4访问到 从w的位置移动4个字节到d的位置,
// * ( *(p+1)+4) p[1][4]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值