初阶指针知识点总结
今天分享一个自己总结的初阶指针知识点:
1.首先什么是指针
指针就是一个变量,用来存放地址的变量,利用他可以找到该地址位置的内存单元,他起一个指向作用,属于一个形象化的定义。
2.一级指针及定义
举例如下:
int a = 10;
int *p = &a;
可以看出指针的定义方式就是: 指针类型 + *
此时的p就是一个指针变量,他存放着a在内存中所处的地址。
指针和变量一样同样具有类型:int,char,float,short,long,double,不同类型的指针对应不同类型的变量的地址。
注:指针大小在32位平台是4个字节,在64位平台是八个字节!
3.指针的解引用
举例如下:
int a = 10;
int* p = &a;
*p = 20;
printf("%d\n",a);
a的运行结果为20,有人可能会有疑惑,a的值不是10么,怎么变成20?
原因是p存着a的地址,所以通过p可以找到a,a中本来存放的值是10,而就是*p这个关键的操作,影响了a的值,因为 *p 表示的是对指针p进行解引用,也就是获取p所存放的该地址位置上的值,*p = 20就解引用获取了a的值并把a的值改为了20,所以再输出a的值时,a的值就变为了20,这是对内存地址上的变量进行了修改是会改变原值的。
注:指针的类型决定了对指针解引用的时候有多大的权限(能操作几个字节)!
4.指针运算
(1)指针±整数
举例如下:
int a = 10;
int*p = &a;
printf("%p\n",p);
printf("%p\n",p+1);
运行结果:arr -> 007CFEB8 arr -> 007CFEBC ,可以看出两个指针的值相差了4刚好一个字节,所以指针±整数就是指针的值(存放的地址)±整数,而加减多少由所指向的变量类型决定。
(2)指针-指针
举例如下:
char* s = "abcde";
char* p = s;
while (*p!='\0')
{
p++;
}
printf("%d\n",p-s);
运行结果:这个程序我想不难看明白,就是一个求字符串长度的方法,定义一个指针s所指向的字符串abcde,然后让p也指向s,然后while循环就是让p走到字符串的末尾,p-s其实就是计算他们之间有多少个元素。
重点: 在这里补充一个概念就是关于电脑的大小端字节序。
举例如下:
int num = 0x11223344;
char* p = (char*)#
printf("%x\n",*p);
printf("%x\n",*(p+1));
运行结果: 44 33
这种结果的话就是小端字节序,因为11223344来看44是低位,而p是低地址,p+1是高地址,低地址存放低位,高地址存放高位所以是小端字节序。
而如果是相反结果的话那就是大端字节序,低地址存放高位,一般来说大端字节序要遇到的更多一些,因为他也更符合我们的思想,把一个数拆分后,低地址存放高位,高地址存放低位。
所以这就是一个判断电脑大小端字节序的方法!
5.指针和数组名
数组名是什么?
举例如下:
int arr[10] = {1,2,3,4,5,6,7,8,9};
printf("%p\n",arr);
printf("%p\n",&arr[0]);
运行结果:arr和&arr[0]是同一个地址,由此可见数组名表示的就是数组首元素的地址。
6.指针和数组
前面也说了指针和数组名,以及指针±整数的运算,所以有了这两个前提就可以通过一个指针存放数组名,然后指针+ i(i为自己想访问的第几个元素)来访问自己指定想访问的元素,指针+i其实就是计算的是数组下标为i的元素的地址。
7.二级指针
指针也是变量,是变量在内存中就有地址,那指针变量的地址存放在哪里呢?答案当然是二级指针
举例如下:
int a = 10;
int*pa = &a;
int**ppa = &pa;
a的地址存放在pa中,pa的地址存放在ppa中,pa是一级指针,而ppa是二级指针。
当然解引用操作和一级指针一样。
8.指针数组
首先要搞清楚这是数组还是指针,需要看最后两个字是数组,所以这是一个数组。
比如 int* arr[3]
这个数组名为arr,里面有三个元素,每个元素又是一个整形指针。
上一篇: C语言/C++指针知识点总结详解
下一篇: 指针C5知识点总结