欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《C指针知识点总结》

程序员文章站 2022-03-05 23:23:43
...


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.总结

对指针的基本知识学习,大致了解了指针的门槛,对指针五花八门的变形后的涵义功能是什么都有所掌握,不能说非常精通,至少可以应付的了常见的类型。希望在接下来的指针进阶知识中能盆满钵满,吃透指针这个小怪物。