初学c语言记录指针

初学指针没多久,记录下知识,可能有错,欢迎指出或者补充

1:指针变量:存放地址 ; 指针:地址
在这里插入图片描述

在这里插入图片描述

左边是地址常量,不能把常量赋给常量

2:首地址:变量所占的存储区域中的第一个单元的地址
在这里插入图片描述
首地址位1001

3:指针和一维数组
①对于一个一维数组int a[5],首地址应该是a[0]的地址,而不是a[0]中4个字节中第一个字节的地址,虽然值一样;

②定义一个一维数组,数组名是这个数组的首地址,那么数组名a是什么类型?
在这里插入图片描述
是int *类型,那么&a呢?
在这里插入图片描述
此时会发出警告:int*与int (*)[5]的间接级别不同,此时&a是(int *)[5]类型,下面是正确写法
在这里插入图片描述
p指向整个一维数组,*p即是a,对于p+1,加了20字节,而上面的p+1只是加了四个字节,来到下一个元素。

③访问数组元素
int *p=a,p指向a[0];
遍历数组(一部分,看看++p和p++的区别)
这里的话
在这里插入图片描述
*(p+i)用的多点,或者直接p[i];

④a永远是数组名,不能改变,a可以看成一个指针常量,不能++,- -,但实际a不是指针常量,如果a++成立,那么数组丢失首地址,找不到了,但可以*(a+1)。

4:指针和二维数组
①对于一个二维数组int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
数组名a的含义:二维数组的首地址,a是指向二维数组的第一个存储单元,即a[0]。一个二维数组的存储单元就是一维数组(这里虽然取地址和&a[0][0]是一样的,但是含义不一样),这样推下去,三维数组的存储单元即为二维数组。上述二维数组用a+1,这时候指向下一个一维数组a[1]。

在这里插入图片描述
在这里插入图片描述
②一个二维数组可以拆成多个一维数组,一维数组又包含了多个元素,不管是一维数组还是二维数组,在空间的存储方式都是连续存储,不是什么“田”字。

③*(a+1)是a[1]的首地址,*(*(p+m)+n)表示的是第m行第n列的值,也可以直接p[m][n]。

在这里插入图片描述
上面两种方法输出一样

总之,p指向一个变量的地址,*p就是变量本身

5:指针的大小;32位编译环境下位4字节,64位下为8字节
在这里插入图片描述
那么sizeof(int *p2[3][4])和sizeof (int (*p)[2][3])是多大?
在这里插入图片描述
第一个p是48,因为p是指针数组,表示装有12个指针,而p1是数组指针,表示一个指针指向一个三行四列的二维数组。

6:指针和字符串
① char str[]={“Hello”};
作为字符数组存放在栈区,可以修改
在这里插入图片描述
② char *str2={“Hello”};
”Hello“ 作为字符串常量存放在字符常量区,放在静态区,只可读不可修改
在这里插入图片描述
引发异常,也很好理解,就相当于‘1’=2。

③所以为了不会再程序运行结束时候出现这样的错误,一般都写为const char *p="Hello",这样修改的时候就会报错,不至于等到程序运行时候才发现。

7:在这里插入图片描述
看看就好

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值