【C生万物】 指针篇 (进级) 上

这篇具有很好参考价值的文章主要介绍了【C生万物】 指针篇 (进级) 上。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 欢迎来到 Claffic 的博客 💞💞💞                               👉 专栏:《C生万物 | 先来学C》👈

【C生万物】 指针篇 (进级) 上

前言:

前面已经带大家学习了初级的指针,先回顾一下重点:指针是用来存放地址的变量;指针的大小是4/8字节;指针类型决定了指针+-整数的步长和指针解引用的权限。这期继续探讨指针,相信你会有更加深入的理解。


目录

Part1:字符指针 

Part2:指针数组

Part3:数组指针

1.定义

2.&数组名与数组名

3.使用


Part1:字符指针 

我们知道指针是有类型的,其中一种是字符指针类型 char* 

❓那么字符指针是如何指向字符的呢?接下来带大家探讨:

一般的使用:

int main()
{
	char ch = 'e';
	char* pc = &ch;
	*pc = 'e';

	return 0;
}

这种就是指针 pc 指向 字符 e

还有一种使用方法: 

int main()
{
	const char* pstr = "Hello world";
	printf("%s\n", pstr);

	return 0;
}

👁️‍🗨️运行结果:

【C生万物】 指针篇 (进级) 上

❓提问:pstr 是指向 Hello world 整体吗?

实际上并不是的

而是把字符串  Hello world 的首字母 H 的地址存放到 pstr 中了:

【C生万物】 指针篇 (进级) 上

下面有一道题,以加深理解: 

int main()
{
	char str1[] = "Hello world";
	char str2[] = "Hello world";
	const char* str3 = "Hello world";
	const char* str4 = "Hello world";

	if (str1 == str2)
		printf("str1 and str2 are same\n");
	else
		printf("str1 and str2 are not same\n");

	if (str3 == str4)
		printf("str3 and str4 are same\n");
	else
		printf("str3 and str4 are not same\n");

	return 0;
}

👁️‍🗨️输出结果:

【C生万物】 指针篇 (进级) 上

解释:

str1 和 str2 是分别开辟的两个数组,用相同的常量字符串去初始化两个数组,也是会开辟出不同的内存块。所以 str1 与 str2 不同。

C/C++会把常量字符串存储到单独的一个内存区域,str3 和 str4 指向的就是同一个常量字符串,所以 str3 和 str4 相同。

Part2:指针数组

这一部分在指针初级提到了,这里回顾一下:

指针数组本质是什么?

答:数组。

以下的指针数组是什么意思?

int* arr1[3]; 
char* arr2[2]; 
char** arr3[1];

答:

int* arr1[3];      --- 存放一级整型指针的数组
char* arr2[2];   --- 存放一级字符指针的数组
char** arr3[1];  --- 存放二级字符指针的数组

Part3:数组指针

1.定义

接上文的指针数组,这里有蹦出个数组指针,

老样子,先回答:数组指针是数组还是指针?

答:指针

我们已经知道整型指针指向整型,浮点型指针指向浮点型,

那么数组指针就是指向数组的指针

需要明确的就是它的表示方式:

int* p1[10];  // 这是一个指针数组
int(*p2)[10]; // 这是一个数组指针

数组指针相比指针数组的区别就是多了个括号 ( ) 

解释:

• p 先和 * 结合,说明 p 是一个指针变量,然后指着指向的是一个大小为 10 个整型的数组。所以 p 是一    个指针,指向一个数组,叫数组指针。

• [ ]的优先级要高于*号的,所以必须加上 ( ) 来保证p先和*结合。 

2.&数组名与数组名

先给你一个数组:

int arr[10];

问: arr &arr 分别是啥?

让计算机告诉我们:

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	printf("%p\n", arr);
	printf("%p\n", &arr);

	return 0;
}

👁️‍🗨️运行结果:

【C生万物】 指针篇 (进级) 上

这两个结果是一样的欸,

真正如此吗?

再来看下面这一段代码:

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	printf("arr = %p\n", arr);
	printf("&arr= %p\n", &arr);
	printf("arr+1 = %p\n", arr + 1);
	printf("&arr+1= %p\n", &arr + 1);

	return 0;
}

 👁️‍🗨️运行结果:

【C生万物】 指针篇 (进级) 上

看到没有,arr&arr+1不同,即步长不同,可以断定 &数组名与数组名意义不同

&arr 表示的是数组的地址,而不是数组首元素的地址

3.使用

学会了数组指针,终究是要运用的,那么数组指针是如何使用的呢?

数组指针指向的是数组,那么数组指针中存放的就是该数组的地址:

以下代码是存放一个数组的地址:

#include <stdio.h>
int main()
{
	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
	int(*p)[10] = &arr;//把数组arr的地址赋值给数组指针变量p

	return 0;
}

不过很少这样使用,多数是应用在函数传参当中:

void print_arr(int(*arr)[3], int row, int col) // 形参1是数组指针
{
	int i = 0,j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}

int main()
{
	int arr[10] = { 0,1,2,3,4,5,6,7,8 };
	print_arr(arr, 3, 3);

	return 0;
}

 👁️‍🗨️运行结果:

【C生万物】 指针篇 (进级) 上

你知道么,向 print_arr 传递的 arr 是二维数组第一行的地址,也就是一维数组的地址。

来,回顾一下,判断以下代码分别表示什么:

int arr[5];
int* parr1[10];
int(*parr2)[10];

还是简单的,

 int arr[5] 表示数组,

 int* parr1[10] 表示指针数组,

 int(*parr2)[10] 表示数组指针。

没意思?那这个呢?

int (*parr3[5])[3];

答:数组指针数组

解释:

( ) 内的优先,先看括号内的:

[ ] 的优先级高于 * ,parr3 先与 [ ] 结合,则 parr3 是一个数组,该数组有5个元素,

那么存放的元素是什么类型呢? 是 int(*)[3] ,也就是数组指针 

图示: 

【C生万物】 指针篇 (进级) 上


总结: 

这篇博客先到这里,主要讲了字符指针,数组指针,指针数组,到这里还没完,下期接着讲解指针进级,不过要先消化好这一篇哦 ~

码文不易 

如果你觉得这篇文章还不错并且对你有帮助,不妨支持一波哦  💗💗💗文章来源地址https://www.toymoban.com/news/detail-450991.html

到了这里,关于【C生万物】 指针篇 (进级) 上的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C生万物 | 剖析函数指针经典应用 —— 回调函数

    不懂函数指针的老铁可以先看看这篇文章【指针函数与函数指针】,上车,准备出发🚗 回调函数就是一个通过【函数指针】调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数

    2024年02月04日
    浏览(52)
  • C生万物 | 从浅入深理解指针【最后部分】

    我们前面学了四个部分了,如果没有看前面的建议可以看一下前面的~~ C生万物 | 从浅入深理解指针【第一部分】 C生万物 | 从浅入深理解指针【第二部分】 C生万物 | 从浅入深理解指针【第三部分】(转移表的实现) C生万物 | 从浅入深理解指针【第四部分】(qsort的使用和模

    2024年02月04日
    浏览(41)
  • C生万物 | 指针入门到进阶全方位覆盖教程

    文章篇幅较长,可前往电脑端进行学习💻 之前很多粉丝私信我说 C语言指针 怎么这么难,看了很多视频都学不懂,于是我写了一篇有关指针从入门到进阶的教学,帮助那些对指针很困扰的同学有一个好的学习途径,下面是本文的参考配套视频,出自b站【鹏哥C语言】,鹏哥讲

    2024年02月09日
    浏览(59)
  • C生万物 | 从浅入深理解指针【第一部分】

    1.1 内存 在讲内存和地址之前,我们想有个生活中的案例: 假设有一栋宿舍楼,把你放在楼里,楼上有100个房间,但是房间没有编号,你的一个朋友来找你玩,如果想找到你,就得挨个房子去找,这样效率很低,但是我们如果根据楼层和楼层的房间的情况,给每个房间编上号

    2024年02月08日
    浏览(43)
  • C生万物 | 指针入门到进阶史上最全面教程

    文章篇幅较长,可前往电脑端进行学习💻 之前很多粉丝私信我说 C语言指针 怎么这么难,看了很多视频都学不懂,于是我写了一篇有关指针从入门到进阶的教学,帮助那些对指针很困扰的同学有一个好的学习途径,下面是本文的参考配套视频,出自b站【鹏哥C语言】,鹏哥讲

    2024年02月04日
    浏览(34)
  • C生万物 | 指针入门到进阶就看这篇了【十万字吐血整理,收藏学习】

    文章篇幅较长,可前往电脑端进行学习💻 之前很多粉丝私信我说 C语言指针 怎么这么难,看了很多视频都学不懂,于是我写了一篇有关指针从入门到进阶的教学,帮助那些对指针很困扰的同学有一个好的学习途径,下面是本文的参考配套视频,出自b站【鹏哥C语言】,鹏哥讲

    2024年02月03日
    浏览(50)
  • 第七次作业 运维高级 docker容器进级版

    1、使用mysql:5.6和 owncloud 镜像,构建一个个人网盘。 (1)拉取相应镜像 (2)运行mysql:5.6容器 (3)运行owncloud容器 (4)查看并验证 之后在浏览器中输入ipaddress:8080 2、安装搭建私有仓库 Harbor (1)下载好harbor和docker-compose (2)上传到Linux服务器 (3)复制docker-compose并修改权限 (4)解压harbor (

    2024年02月12日
    浏览(57)
  • 万物流动 万物永驻 ——C++ Core Guidelines的流动哲学

    众所周知,C++ 是一门自由的语言,语言的设计哲学之一就是赋予程序员极大的自由度和灵活性,因此,使用C++ 完成一个任务时,不同的程序员往往会有不同的实现方法,这真正阐释了什么叫条条大路通罗马。不过,这种自由和灵活的代价就是语言复杂度的提升,学习曲线也

    2024年02月10日
    浏览(35)
  • C生万物呀

    1、快捷键 快捷键 描述 ctrl+滚轮 字体变大小 ctrl+K+C 注释 ctrl+K+U 取消注释 home 行首 end 行末 2、C语言标准库函数 3、字符字符串 双引号:字符串 单引号:字符 4、占位符 符号 技能 n 换行 %d 整数 %c 字符 %f 浮点数 %c 字符 5、C语言的(保留字) 6、数据类型 7、ASCII编码

    2024年01月19日
    浏览(35)
  • SAM(2023)-分割万物

    论文: 《Segment Anything》 github: https://github.com/facebookresearch/segment-anything 作者构建到目前为止最大分割数据集,包括1billion mask及11M image,该模型训练过程是可提示的,所有可以进行zero-shot任务,甚至超越之前全监督结果。 SAM结构如图4,包括: 图像编码器、灵活的prompt编码器、

    2023年04月27日
    浏览(100)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包