C语言指针相关知识(一)(字符串和指针、指针数组和数组指针)

在这里插入图片描述

每个变量在内存中都有一个属于它自己的位置,每个位置都有一个地址,我们可以使用 & 取地址符来获取地址,表示在内存中的一个地址。
取址运算符 & 的功能是取得对象的地址,打印地址时是使用%p

指针示例
指针示意图

指针定义和声明

现在我们就清楚什么是指针了,指针就是内存地址,指针变量是用来存放内存地址的变量,在声明指针之后,才可以使用指针来存取其他变量的地址。
声明形式为:type* var_name 或者 type *var_name;
type 为指针的基本类型,var_name为指针变量的名称,* 用来声明这个变量是一个指针。

以下都是有效的,空格使用与个人习惯有关。
int* pi;    // 一个整型的指针
double *pd;    // 一个 double 型的指针
float * pf;    // 一个浮点型的指针
char*pc;    // 一个字符型的指针

指针的使用

*p 相当于通过指针 p 指向的变量 a 的地址,再把地址里存的内容取出来。因为指针 p 存放了变量 a 的地址,所以可以使用 *p 来获取变量 a 的值。
可以这么理解:
p 就是变量 a 的地址,*p 就是变量 a 的值。

指针的使用

指针和数组

我们可以通过指针运算来访问数组里的内容。
当指针 pa 指向 arr[0] 时,pa + i 就指向 arr[0] 后的第 i 个元素。
例如下面这个程序,pa + 1 就指向 arr[1] 的地址,pa + 2 就指向 arr[2] 的地址,所以 &arr[i] 等价于 pa + i,arr[i] 等价于 *(pa + i) (前面这个只适用于 pa 指向数组里第一个元素 arr[0] 时)。

使用指针访问数组

*(pa + i) 也可以写成 pa[i] 。而数组名 arr 也是地址,所以 arr + i 就是首元素第 i 个元素的地址,对其解引用也可获取该元素的值,即 *(arr + i)。
所以,*(pa + i) 、 pa[i] 、 *(arr + i)、arr[i] 都能访问到首元素后第 i 个元素的值。
相应的,下面四个都是指向第 i 个元素的指针:&arr[ i ] 、arr + i 、 &p[ i ] 、 p + i
元素的不同获取方法
加法具有交换律,所以 *(pa + 3) 也可以写成 (3 + pa),(arr+3) 可以写成 *(3+arr),又因为 *(arr+3) 和 arr[3] 等价,所以 *(pa + 3) 和 *(3 + pa) 可以写成 pa[3] 和 3[pa](可读性不好且容易出错,不建议使用)。
不同表达式

  • 指针只能加上一个整数,不能指针加指针(地址加地址毫无意义),但是可以指针减去指针,得到的就是地址间的元素个数。
    指针减指针

字符串和指针

用数组实现的字符串和用指针实现的字符串有相同的地方也有不同的地方。
数组和指针创建的字符串里的最后一个字符都是 \0,指针可以重新赋值,但数组不行。字符串和指针
char 型指针每次移动一个字节。
char型指针

指针数组

当然,我们可以利用指针来创建字符串数组。
这里的 pc 就是指针数组,指针数组就是存放指针的数组,而指针存放的是地址。
指针数组是数组,那我们就可以这样声明:
int* pa[ ]={};
案例一:
指针数组
案例二:
指针数组

那么我们就可以利用指针来求字符串的长度。
字符串长度

数组指针

数组指针就是数组的指针,也就是指向数组的指针。
如何声明?
int arr[5] = {1,2,3,4,5};
int (*pa)[5]= &arr;
因为 [ ] 优先级比 * 大,如果不使用 ( ) 将指针变量和 * 括起来,那就变成指针数组了。
数组指针
使用情况:
在这里插入图片描述

对于指针的知识还有很多,这里先告段落(懒),有些地方说的不是很全,也不太好(菜)。哪里说错了还请指正。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值