推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

(每日一题)为什么说C?——数据共享与建立副本的区别

   2023-06-17 网络整理佚名1750
核心提示:为什么说C指针是C语言的灵魂?语言的数组和指针的书。语言的数组和指针是完全不同的。对于数组和指针,它们在哪些地方是相似的,又在哪些地方是不同的?在表达式中,数组可以被解读成指向其初始元素的指针。•数组和指针是不同的事物。语言中也存在“指针类型”这样的类型。因为“指针类型”是类型,所以它和int类型、类型一样,也存在“指针类型变量”和“指针类型的值”。

为什么C指针是C语言的灵魂?

来自读者对 C 和指针的解释

他可以直接访问硬件,这是灵活性和效率的体现。 程序离硬件越近,自然效率越高。 当然,使用不当也会导致效率低下。

难以掌握且太危险。 如果对指针的理解模糊,访问过程不当很容易导致程序崩溃或隐患

一般来说,指针的作用是增加程序的效率,因为它传递的是C语言定义的各种数据结构的地址,而不需要连续的值传递。 要理解它,您可以考虑数据共享和创建副本之间的区别。

注:欢迎程序员继续补充

挖掘C语言的灵魂,先看《征服C的指针》这本书

读者对本书的评价:

购买前必读:

这是一本关于C语言中数组和指针的书。

■ 虽然本书的读者对象是“学过C语言,但在指针的使用上遇到困难”的读者,但难点的内容还是随处可见。 那是因为我不能免俗,偶尔也喜欢炫耀自己掌握的知识。

■ 对于初学者,完全没有必要从头读起。 遇到不明白的地方不要太纠结。 阅读时可以跳过章节。 对于第 0 章和第 1 章,最好按顺序阅读。 如果觉得第二章有点难,可以先看第三章。 如果您不理解第 3 章,请先尝试阅读第 4 章。 这种阅读方式是本书最大的卖点。

■ 在本书中,我会经常指出一些“C的问题”和“C的不足”。 有些读者可能认为我讨厌C语言。 相反,我认为 C 是一种伟大的开发语言。 倒不是因为有“仁者见仁智者见智”或者“能干的坏小子也可爱”之类的理由。 毕竟在开发现场常年使用的语言中 ,C语言还是相当强大的。 即便他长得不是很帅,但论才华,依然是“开发现场的老油条”。

迷你书下载要点:记住什么:数组和指针是不同的东西

为什么会造成混乱?

首先,请允许我强调本章的一个重点。

C语言中的数组和指针是完全不同的。

大家都说C语言中的指针比较难,但真正让初学者“抓墙”的不是指针本身的使用,而是“混淆数组和指针”。 此外,很多“秘籍”入门书籍中对指针和数组的解释也极其混乱。

例如K&R(p.119)中有如下一段话,C语言中指针和数组的关系很强,所以必须把指针和数组放在一起讨论。

许多 C 程序员认为“数组和指针几乎是一回事”,这种理解是造成 C 语言混乱的主要原因。

从图3-17一目了然,一个数组是由一些对象排列而成的,指针就是指向某处的意思。 他们是完全不同的。

带着“数组和指针几乎是一回事”的误解,初学者往往会写出如下代码:

int *p; p[3] = …… ←突然使用没有指向内存区域的指针 ——自动变量的指针在初期状态,值是不定的。 char str[10]; . . . str = “abc”; ←突然向数组赋值

——数组既不是标量也不是结构体,暂时不能使用。

诠释 p[]; ←使用空[]声明局部变量——只有在“函数形参声明”中,数组的声明才可以解释为指针。 对于数组和指针,它们在哪些方面相似,在哪些方面不同? 对不起,下面可能有重复内容。

在表达式中 在表达式中,数组可以作为指向其初始元素的指针来读取。 所以,可以这样写:

int array[10]; p = array; ←将指向array[0]的指针赋予p

然而,反过来写如下,

array = p;

这是不可能的。 的确,array在表达式中可以解释为一个指针,但本质上它实际上被解释为&array[0],此时的指针是一个右值*。 (除了此时指针是右值的原因外,数组在标准中也不是“可变左值”。)

例如,对于一个int类型的变量a,a = 10; 这样的分配是可能的,但肯定没有人愿意做 a + 1 = 10; 这样的任务。 虽然a和a+1都是int,但是a+1没有对应的内存区域,只是一个右值,所以不能赋值。 同理,数组不能赋值。 此外,对于以下指针,

int *p;

如果p指向一个数组,自然可以通过p[i]来访问,但这并不意味着p就是一个指针。

p[i]只是*(p + i)的语法糖,只要p正确指向一个数组,就可以通过p[i]访问数组的内容,如图3-18所示。

如果它是“指针数组”和“数组数组”,则有很大区别。

char *color_name[] = { ←指针的数组 “red”, “green”, “blue”, };

将上面的代码图解(参考图3-19),

![enter image description here][5] char color_name[][6] = { “red”, “green”, “blue”, }

将上面的代码图解(参考图3-20),

以上两种情况,都可以通过[i][j]的方式访问数组,但是数据在内存中的布局是完全不同的。

声明 只有在声明函数的形参时,数组的声明才可以解释为指针的声明(参见3.5.1 节)。

上面的语法糖,与其说是让C更容易理解,倒不如说是让C语言的语法更加混乱。 很多人都这么认为吗? 我就是其中之一(尽管使用这种语法糖可以使作为参数传递的多维数组更容易理解......)。 而 K&R 的解释使混乱更加严重。

当不声明函数的形式参数时,数组声明和指针声明不能相等。

使用时最容易出问题(参考3.5.2小节)。另外,在声明局部变量或结构体成员时,写成

int hoge[];

会导致语法错误(对于结构的成员,这在 ISO C99 中是允许的)。

当有数组初始化表达式时,可以使用empty[],但这是因为编译器可以计算数组元素个数,所以元素个数的写法可以省略。 仅此而已,此功能与数组无关。

重点【非常重要! ! ] • 数组和指针是不同的东西。

臭名昭著的指针到底是什么

关于术语“指针”,在 K&R(第 5 章“指针和数组”开头)中有如下说明: 指针是保存变量地址的变量,在 C 中经常使用。

其实从表达上来说,这样的解释是有很大问题的。 总让人觉得一提到指针,就必须把它当成变量。 其实并不总是。

还有,在C语言标准中最初出现“指针”一词的部分,有这样一段话:

指针类型(类型)可以派生自函数类型、对象类型或不完整类型,派生指针类型的类型称为引用类型。 指针类型描述了一个对象,该对象的值提供对该引用类型的实体的引用。 从引用类型 T 派生的指针类型有时称为“指针(指向)T”。 从引用类型构造指针类型的过程称为“指针类型派生”。 可以递归地应用这些构造派生类型的方法。

这段话的内容可能会让你一头雾水(既然是标准,那肯定是有点标准的)。 那么我们重点看第一句,出现“指针类型”二字的地方。

一提到“类型”,你马上就会想到“int类型”、“类型”等等。 同样,在C语言中也有一种类型叫做“指针类型”。

“指针类型”不是单独存在的,它是从其他类型派生出来的。 上面对标准的引用还指出“从引用类型 T 派生的指针类型有时称为‘ (to) T’”。

也就是说,实际存在的类型是“指向int的指针类型”、“指向int的指针类型”。 因为“指针类型”是一种类型,与int类型和类型一样,也有“指针类型变量”和“指针类型值”之分。 不幸的是,“指针类型”、“指针类型变量”、“指针类型值”常常被简单统称为“指针”,因此非常容易造成歧义,需要引起警惕*。

(*至少这本书试图区分这些表达方式,但有时候,无论你怎么写,都不能自然地表达出你想表达的东西,最后不得不投降......非常抱歉。 )

要点

首先是“指针类型”。 只有有了“指针类型”,才有“指针类型变量”和“指针类型值”。

例如,在 C 中,使用 int 类型来表示整数。 因为int是一种“类型”,所以有保存int类型的变量,当然也有int类型的值。 指针类型也是一样,既有指针类型的变量,也有指针类型的值。

因此,在几乎所有的处理程序中,所谓的“指针类型的值”,实际上都是指内存的地址。

变量的内容存储在内存的某处,而“某处”这个词总是令人困惑。 因此,就像用“门牌号”来确定“地址”一样,在内存中,我们也给变量赋值了“门牌号”。 在C的内存世界中,一个“门牌号”被称为一个“地址”。

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON