我一直觉得指针是c语言最难的部分,感觉学的特别差,今天想好好谈谈指针。
指针在32位操作系统下是4个字节,在64位操作系统下是8个字节.
下面区别一下%p %x,%p输出的是指针的格式,主要是16进制输出,%x输出的是16进制,是int类型。
在32位操作系统下,%p和%x是没有区别的。
在64位操作系统下,%p输出的是8个字节,%x输出的是4个字节,%p输出若不够8位,会在前面补0.
冯诺依曼体系结构: 输入设备 cpu 内存(存储器)外存(硬盘) 输出设备。
指针是编程语言的一个对象,利用地址,它的值指向存在电脑储存器中另一个地方的值,由于利用地址能找到所需的变量单元,可以说,指针指向该变量单元,在计算机的内存中,内存中的每一个位置由一个独一无二的地址标识,内存中的每一个位置都包含一个值。https://blog.csdn.net/tianmaxingkong_/article/details/41593483(这篇博客里面把指针指针变量讲的很清楚)
注意这些值的输出结果,下面区分一下指针和指针变量。
指针是个变量,存放内存地址的单元,int i =5;int* p=&i,&i就相当于指针,把i的指针&i赋值给了int*型指针变量p,p中存放着&i,所以说指针变量就是存放指针的变量。也可以说指针就是变量,用来存放地址的变量。1k就是2^10次方个字节,1M就是2^10*2^10次方个字节,1G就是2^10*2^10*2^10次方个字节,所以在32位操作系统上,有4G的空间用来编址,这也就很容易明白,在32位操作系统上指针为什么是4个字节,64位操作系统上是8个字节.
什么是一级指针?
给指定的内存上写入数据*(int*)0x12ff7c=0x100;左右值“=”右边的就是右值,等号左边的就是左值。a作为右值的时候,代表的是数组首元素的首地址&a[0]的意思,a不能作为左值,但是a[i]可以作为左值。
一级指针在作为函数参数的时候,调用的时候,函数的形参和实参分别占有不同的内存块。,只是这个内存空间存放的指针指向的是同一块地址,函数的形参只是实参的拷贝,在传值调用的时候,对形参的修改不会影响实参。
但是一级指针在使用过程中应该改注意:
1.在传值调用的过程中,不要在函数中改变形参的指向来达到改变实参指向的效果,他们占有不同的内存块,修改形参不会影响实参。 2.在传址调用的过程中形参和实参虽然占用不同的内存块,但是内存空间存放的指针指向的是同一块地址,所以在形参中改变其指向空间的值,如此实参指向的空间地址也发生改变。
通
从上面的运行结果可以看出,在pointer1 函数中改变形参p的指向,并不会改变实参p的指向。所以输入的值是一堆脏数据。
但是,进行如下的修改之后,看看运行的效果。
修改之后的运行结果,从代码的改动可看出 pointer1函数中修改的不是形参指针的指向,而是修改形参指针指向的空间的内容。这样就能达到一级指针做函数返回值的效果。
什么是二级指针?
二级指针的形式是**p,指向指针的指针,通过二级指针,可以方便的通过改变形参的指向,来达到改变实参的目的。
二级指针的使用一般不常见,经常会用到typedef来使代码可读性更强,不然很容易出错。
指针和数组
指针在32位操作系统下是4个字节,在64位操作系统下是8个字节,
指针数组就是一个存放指针的数组例如 int* arr1[10] char *arr2[20] char** arr3[20] 数组指针是指针, int *pint能够指向数组的指针。
数组指针就是能够指向数组的指针,int *p1[10]是一个指针数组, int (*p)[10]是数组指针,p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组,所以p是一个指针,指向一个数组,叫数组指针。
完成课堂代码和练习。
int arr[10],中arr和&arr虽然此处值一样,但是代表的意义不一样,&arr代表的是数组的地址,arr以%p输出输出的是数组首元素的地址,&arr+1相当于跳过整个数组的大小,所以&arr+1相对于&arr的差值为40.数组指针指向的是数组,存放的是数组的地址。