C语言之指针

我一直觉得指针是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.数组指针指向的是数组,存放的是数组的地址。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值