《C指针知识点总结》
《C指针知识点总结》
1.指针
(1).指针是一个变量,用来存放地址,地址可以唯一标识一块内存空间,指针的大小是固定的,在32位系统上占4字节,在64位系统上占8字节。
(2).指针是有类型的,跟基本的变量类型一样,只不过指针的类型是在原来基础上多了一个*,将“”和其他类型结合就构成了指针类型的变量,例如:char,int* ,double* float*等等。
(3).指针变量包含 了两部分信息:第一它指明了起始地址,第二它指明了内存大小。需要注意的是指针变量自身占据的空间是一样大的。
(4).空指针(void指针):是指一种特殊的指针,只能表示地址,不能表示大小,可以用来保存各种不同类型的指针的地址,但是不能对void*指针直接解引用。
(5).野指针:是一种非法的指针,如果对它进行解引用操作,会引发未定义行为。
2.指针运算
(1).p + i 或 p - i
int* p = NULL;
printf("%p\n",p + 1);
printf("%p\n", p + 2);
输出结果分别是:
00 00 00 04
00 00 00 08
总结;对指针进行p+i运算,不是简单的加i,而是加i倍的指针类型的大小。
(2)*p++运算
这个涉及到运算符的结合性问题,在这里先算p++,再算*
(3)指针-指针:p1-p2
指针-指针运算相减得到的结果是两个地址之间隔了几个元素,一般是没有什么意义的。除非两个指针指向的是同一个连续的内存空间,指针相减才有意义。
(4)关系运算:==,!=,<,<=, >, >=
指针的关系运算一般用来作判断条件,结果非0表示真,0表示假。
if (p != NULL) 和if(p)是等价的
if (p == NULL)和if(!p)是等价的
3.大小端字节序
(1)大端字节序:是指数据在计算机系统中,数据的低位保存在内存的高地址中,而数据的高位保存在内存地址的低地址中。
(2)小端字节序:是指数据在计算机系统中,数据的低位保存在内存的低地址中,而数据的高位保存在内存地址的高地址中。
(3)简单的判断当前系统是大端字节序还是小端字节序的程序。
//判断大小端字节序函数
void isBigEnd(){
int a = 0x11223344;
int* p = &a;
int* p2 = (char*)p;
if (*p2 == 0x11){
printf("大端字节序\n");
}
else{
printf("小端字节序\n");
}
}
4.指针数组和数组指针
(1)指针数组:是个数组,每个元素是一个指针类型的变量。直接使用数组名得到的是指向首元素的地址。 例如:int* arr[10] = {0};
(2)数组指针:是指针,指向了一个数组,数组名取地址是指向改数组的指针。例如:int arr[10] = {0}; int(*p)[4] = &arr;
其中p和*先结合成一个指针变量,然后指向的是一个大小为10个整型的数组,所以p是一个指针,指向的是一个数组,叫数组指针。
5.总结
对指针的基本知识学习,大致了解了指针的门槛,对指针五花八门的变形后的涵义功能是什么都有所掌握,不能说非常精通,至少可以应付的了常见的类型。希望在接下来的指针进阶知识中能盆满钵满,吃透指针这个小怪物。