初学c语言记录指针

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

1:指针变量:存放地址 ; 指针:地址
初学c语言记录指针_第1张图片

在这里插入图片描述

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

2:首地址:变量所占的存储区域中的第一个单元的地址
初学c语言记录指针_第2张图片
首地址位1001

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

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

③访问数组元素
int *p=a,p指向a[0];
遍历数组(一部分,看看++p和p++的区别)
这里的话
初学c语言记录指针_第4张图片
*(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]。

初学c语言记录指针_第5张图片
初学c语言记录指针_第6张图片
②一个二维数组可以拆成多个一维数组,一维数组又包含了多个元素,不管是一维数组还是二维数组,在空间的存储方式都是连续存储,不是什么“田”字。

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

初学c语言记录指针_第7张图片
上面两种方法输出一样

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

5:指针的大小;32位编译环境下位4字节,64位下为8字节
初学c语言记录指针_第8张图片
那么sizeof(int *p2[3][4])和sizeof (int (*p)[2][3])是多大?
初学c语言记录指针_第9张图片
第一个p是48,因为p是指针数组,表示装有12个指针,而p1是数组指针,表示一个指针指向一个三行四列的二维数组。

6:指针和字符串
① char str[]={“Hello”};
作为字符数组存放在栈区,可以修改
初学c语言记录指针_第10张图片
② char *str2={“Hello”};
”Hello“ 作为字符串常量存放在字符常量区,放在静态区,只可读不可修改
初学c语言记录指针_第11张图片
引发异常,也很好理解,就相当于‘1’=2。

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

7:
看看就好

你可能感兴趣的:(初学c语言记录指针)