C语言指针基础

地址与指针&指针与指针变量
一个变量的地址称为该变量的指针。

通常把通过变量名或变量地址存取变量值的方式称为“直接访问”方式;
把地址存放在一个变量中,然后通过先找出地址变量中的值(一个地址),再由此地址找到最终要访问变量的方法称为“间接访问”。

指针变量:存放地址的变量;
指针变量kpointer指向了变量k,“指向”:变量kpointer中存有k的地址

*++ – & 运算优先级相同,运算顺序自右向左

初始化
指针变量未被初始化意味着指针变量的值是一个随机值,存在潜藏的危险,所以定义指针变量时一定要初始化
p=NULL空指针,空值与p=0;p=’\0’;等价
(预定义符NULL在<stdio.h>头文件里,代表0)

运算
不允许两个指针相加
两个指针变量相减(这两个指针必须指向同一个数组中的元素),相减的结果是元素个数**
指针的关系运算
只有两个指针指向同数组中的元素时可以进行
若p1指向的数组元素在p2指向的元素前,p1<p2为真
若p1、p2指向同一个元素p1==p2为真

指针与数组


一维数组的指针是数组的起始地址
数组名可以作为指针来使用,但区别于普通的指针。
数组名是指针常量,不可以修改;指针可以修改,可以指向其他位置。

int a[N],*p=a;

因为数组名代表其首地址,所以a+i代表的也是地址,它的计算方法与p+i相同
因此,对数组元素a[i]的引用可以用如下两个方法:

  • ①下标法
    a[i]或p[i]
  • ②指针法
    *(p+i) 或 *(a+i)

指针变量的运算
*p++等价于 *(p++)作用是先得到p指向变量的值(*p),再使p+1;

验证如下:

如下情况的发生,可能和编译器的运行相关
在这里插入图片描述
*++p先使p加1,再取 *p(实际运行也存在上述问题)

当p指向a数组中的第i个元素,则 :
*(p- -)相当于a[i- -],先取 *p的值,即a[i],再使p自减
*(++p)相当于a[++i],先使p自加,在作 * 运算,即为a[i+1]
*(- -p)相当于a[- -i],先使p自减,再作 * 运算,即为a[i-1]

一维数组名作函数参数
形参可写为 int *x,int x[ ],
调用函数的实参为a(数组名),p(指针变量),&a[0]

指针和二维数组
C语言将二维数组看作一维数组,一维数组的每一个元素又是一个一维数组。
定义 int a[3][4];
a+1中的1代表一个包含4个整形变量的一维数组所占的存储单元的字节数,即二维数组的一行所占的字节数
a[0]、a[1]、a[2]是一维数组名,C语言规定数组名代表数组首地址,因此a[0]代表第0行一维数组中第0列元素的地址,即&a[0][0]。那么,第0行第一列元素的地址就可以用a[0]+1来表示
时刻注意,a是二维数组名(我个人这里还不很熟悉)
在这里插入图片描述
*(a+1)、a[1]与a+1的值是相同的,但是含义不同。
*(a+1)、a[1]代表第1行第0列的地址,而a+1是1行的首地址。

a、a+1、a+2为每一行的首地址,我们称它们为行指针;
*(a+i)+j(即a[i]+j)表示元素 a[i][j]的地址,我们称为列指针。
二维数组元素地址的表示形式

表示形式含义
a二维数组名,第0行首地址
*(a+0),a[0],*a第0行第0列元素地址
a+1第一行首地址
*(a+1),a[1]第1行第0列元素地址
*(a+1)+2,a[1]+2,&a[1][2]第1行第2列元素地址
* (*(a+1)+2), *(a[1]+2),a[1][2]第1行第2列元素的值

关于a[i]的性质,a[i]形式上是a数组中的第i个元素。
如果a是一维数组名,a[i]代表a数组第i个元素所占的内存单元。a[i]有物理地址,占内存单元。
如果a是二维数组,则a[i]代表的是一维数组名。a[i]本身并不占实际的内存单元,它也不存放a数组中各元素的值。它只是一个地址(如同一个一维数组名不占内存单元只代表地址一样)。

当指针变量指向a[0][0] ,
p+i*4+j代表&a[i][j]
*(p+i *4+j) 和p[i *4+j]都表示a[i][j]的元素。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值