ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

C语言指针知识总结

C语言指针知识总结 第一节 基础1.什么是指针指针是内存单元的编号。我们写下的每一个变量都会存放在内存中指针就是记录他们在内存里的位置通过指针我们也可以找到对应的数据。比如有一个整形类型的变量a他占四个字节它的指针就是他第一个字节在内存里的位置。2.指针变量和操作符1想要获得一个变量的指针变量就要用到取地址操作符比如a就拿到了a的指针变量。指针变量作为一种变量也是有类型的整形的指针变量就是int*字符的就是char*以此类推。当我们获得指针变量也可以访问存于指针变量处的数据需要用解引用操作符*假设有一个指针变量pa*pa就可以访问其中的数据。2指针的大小32位平台下地址是32个bit位指针变量大小是4个字节64位平台下地址是64个bit位指针变量大小是8个字节注意指针变量的大小和类型是无关的只要指针类型的变量在相同的平台下大小都是相同的。3指针的计算指针加减整数会跳过整数乘以去掉*号后类型的大小。指针减指针得到的是两地址相差的元素个数。4void* 指针这种类型的指针可以用来接受任意类型地址。但是也有局限性void*类型的指针不能直接进行指针的-整数和解引用的运算。第二节 深入1.const我们可以直接修改变量也可以通过指针修改变量为了安全性我们可以用const做限制。例const int n 0;现在修改n会报错但是可以通过指针修改n。int const * p可以直接改不能用指针修改指针变量可以指向其他地址。int * const p可以用指针修改但指针变量不能指向其他地址。2.野指针1野指针就是指针指向的位置是不可知的比如指针没有初始化指针越界访问指针指向空间释放都会产生野指针为了防止这种情况我们应当小心指针越界对不使用的指针赋NUL,避免返回局部变量的地址。2assert 断言assert.h头文件定义了宏 assert()它可以很好的用来判断指针是否成为野指针。assert(p !NULL);当运行到这一行代码时如果p不等于NULL,就继续运行否则就报错。3.传值调用和传址调用有的时候我们是必须要使用地址的。例如我要写一个函数这个函数可以让我输入的两个数字交换。我们可能会选择以下的写法。void Swap1(int x, int y){int tmp x;x y;y tmp;}这种写法是没有任何作用的。因为当我把数据传到函数时函数会在其他地址创造形参所以形参的改变是不影响实参的。那这个时候就可以传值调用。void Swap2(int*px, int*py){int tmp 0;tmp *px;*px *py;*py tmp;}这样是通过地址的形式间接修改内容可以达到目的。这个就是传址调用。4.地址与数据(1)数组名假设我们要取这样一个数组的地址。int arr[10] {1,2,3,4,5,6,7,8,9,10};我们之前是这样的int *p arr[0];但实际上数组名就是数组首元素的地址。将arr和arr[0]以地址的形式打印出来是一样的。但是也有例外在sizeof()里()里的arr表示的是整个数组是去计算数据的大小单位是字节。在数组名中数组名表示整个数组取出的是整个数组的地址这不同于数组首元素地址。那么整个数组的地址和数组首元素地址又有什么区别呢arr[0]和arr[0]1相差4个字节但是arr 和 arr1相差40个字节这就是它们之间的区别。(2)二级指针二级指针就是指针存放的地址。当我把一个数据存到一个地址里这个地址也会存到其他地址里面。这个其他地址的指针变量就是多级指针。(3)指针数组和数组指针指针数组int*p[ ]p先和[ ]结合。p是数组数组里面存着指针。数组指针int*p[]本质上是指针指向一个int数组。比如int(*p)[10] arr;这是它的初始化。5.字符指针变量就是char*这个指针变量用来存放字符但它有一些需要注意的地方。我们可以这么使用它char ch w;char *pc ch;也可以这么使用const char* pstr hello bit.;这并不意味着我们把hello bit.放进了pstr这个地址实际上pstr存放的是hello bit.首字符的地址。我们再来看这样的代码const char *str3 hello bit.;const char *str4 hello bit.;str3是等于str4的C/C会把常量字符串存储到单独的⼀个内存区域当几个指针指向同⼀个字符串的时候他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。6.函数指针变量(1)它是用来存放函数的地址的例如假设有一个Add函数我想拿到它的指针变量int Add(int x, int y){return xy;}我可以int(*pf3)(int, int) Add;int(*pf3)(int x, int y) Add;x和y可以不写我们可以这么使用它例如#include stdio.hint Add(int x, int y){return xy;}int main(){int(*pf3)(int, int) Add;printf(%d\n, (*pf3)(2, 3));printf(%d\n, pf3(3, 5));return 0;}结果是5 8(2)函数指针数组要把函数的地址存到⼀个数组中那这个数组就叫函数指针数组定义如下int (*parr1[3])();完
返回列表