【C语言】进阶指针One

113 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

🚩write in front🚩

🔎大家好,我是泽奀,希望你看完后。能对你有所帮助,不足请指正,共同学习交流🔎
🏅2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星Top100~阿里云专家^星级博主~掘金⇿InfoQ创作者~周榜34»总榜1712🏅
🆔本文由 謓泽 原创 CSDN首发🙉如需转载还请通知⚠
📝个人主页-掘金 (juejin.cn)💬
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
📣系列专栏-[C系列] 从0到1 - 泽奀的专栏 - 掘金 (juejin.cn)🎓
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩

 🌀 字符/串指针

在指针当中的类型中我们知道有一种指针类型为字符串指针 char*

可以通过两种方法来访问一个字符或者是字符串。

1、第一种就是使用字符数组来存放字符串或者字符来实现操作。

2、下面所介绍的就是使用字符指针指向一个字符串,此时可不能定义数组。

一般的使用方法如下 👇 

#include<stdio.h>
int main(void)
{
    char ch = 'w';
    char *pc = &ch;
    *pc = 'w';
    return 0;
}

字符型指针方法如下 👇 

#include<stdio.h>
int main(void)
{
	char *str = "hello C";
	printf("%s\n", str);
	return 0;
}

运行结果🖊

hello C

如上示例 👆

定义了字符型指针变量 str,用字符串常量 "hello C" 为其进行赋初值。

注意🔥:这里并不是把 "hello C" 中的所有字符存放在 str 当中,只是把该字符串中的第一个字符 'h' 赋值给指针变量 str,然后printf()再通过'h'找到下一个元素直到遇到'\0'则停止。

本质上是把 "hello C" 这个字符串的首地址存储在了 str 当中。

如下图所示 👇


💥 常量字符串 

常量字符串顾名思义:就是不能被改变的字符/串。

如下示例代码 👇

#include<stdio.h>
int main(void)
{
	char *str = "hello C";
	char arr[] = "hello C";
	*str = 'w';
	arr[0] = 'w';
	printf("%s\n", str);
	printf("%s\n", arr);
	return 0;
}

上述代码所示 👆  

*str 是不能改变字符串当中的值的,最终程序会"挂掉"。

arr  数组是可以改变字符串当中的值。

用调试当中的监视可以证明上述例子!

💥重点核心 :常量字符串是不能被改变的,在内存当中的地址也是一样不能被改变的。


🌀 指针数组 

一个数组的元素值为指针则是指针数组,指针数组是一组有序的指针的集合。 指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。

那么指针数组是怎么样的呢,如下代码所示 👇

int* arr[5];//是什么?

arr 是一个数组,有个元素,每个元素是一个整形指针,是一个存放整形指针的数组。

​编辑

**💥注意:除了每个元素的不同,而指针数组和普通数组在其它方面其实都是一样的!

#include <stdio.h>
int main(void)
{
	int a = 12, b = 17, c = 55;

	int *arr[3] = { &a, &b, &c };

	int **parr = arr;
	printf("%d, %d, %d\n", *arr[0], *arr[1], *arr[2]);
	printf("%d, %d, %d\n", **(parr), **(parr+1), **(parr + 2));

	return 0;
}

运行结果 👇

  • 12 17 55
  • 12 17 55

上述运行结果都是相同的。

上述代码解释 👆   

arr 是一个指针数组,它包含了 3 个元素,每个元素都是一个指针,在定义 arr 的同时,我们使用变量 a、b、c 的地址对它进行了初始化,这和普通数组是多么地类似。

parr 是指向数组 arr 的指针,确切地说是指向 arr0 个元素的指针(首元素的地址),它的定义形式应该理解为**int *(*parr)** ,括号中的 * 表示 parr 是一个指针,括号外面的**int *** 表示 parr 指向的数据的类型。arr0 个元素的类型为 **int *** ,所以在定义 parr 时要加两个 *

**第一个 printf() 语句中,arr[i] 表示获取第 i 个元素的值,该元素是一个指针,还需要在前面增加一个 (解引用) 才能取得它指向的数据,也即 arr[i] 的形式

第二个 printf() 语句中,parr+i 表示第 i 个元素的地址,*(parr+i) 表示获取第 i 个元素的值(该元素是一个指针),(parr+i) 表示获取第 i 个元素指向的数据**

指针还可以与字符串相互结合进行使用,如下代码所示 👇  

#include <stdio.h>
int main(void)
{
	char *arr[3] = { "C", "CSDN", "Electricity" };
	printf("%s <==> %s <==> %s\n", arr[0], arr[1], arr[2]);
    return 0;
}

需要注意的是,字符数组 str 中存放的是字符串的首地址,不是字符串本身,字符串本身位于其他的内存区域,和字符数组是分开的。

也只有当指针数组中每个元素的类型都是**char *** 时,才能像上面那样给指针数组赋值,其他类型不行。 改成下面的形式,与上面的数组是等价的, 如下代码所示 👇

#include <stdio.h>
int main(void)
{
	char *str0 = "C";
	char *str1 = "CSDN";
	char *str2 = "Electricity";
	char **str[3] = { str0, str1, str2 };
	printf("%s <==> %s <==> %s", str[0], str[1], str[2]);

    return 0;
}

运行结果C <==> CSDN <==> Electricity