1
20
也许我只是老了,脾气暴躁,但我看到的其他答案似乎完全没有抓住要点。 C不做数组赋值,句点。不能通过简单的赋值将一个数组分配给另一个数组,这与其他一些语言不同(例如,pl/1;pascal及其许多后代-ada、modula、oberon等)。C也没有真正的字符串类型。它只有字符数组,而且在不使用循环或函数调用的情况下,您不能复制字符数组(比复制任何其他类型的数组还要多)。[字符串文字不算作字符串类型。] 复制数组的唯一时间是将数组嵌入到结构中并执行结构分配时。
在我的K&R第二版中,练习1-19要求一个函数
由于指针在这个阶段还没有被覆盖,解决方案应该使用索引而不是指针。我相信这会导致:
用-dtest编译它以包含测试程序,而不需要只具有函数
使用问题中给出的函数签名,可以避免调用
|
2
8
你的
这种类型的错误称为 dangling pointer .
编辑:
这不是这个答案的评论中指出的悬而未决的修饰语。问题是这句话
此外,您可以通过一次传递来执行反向操作,而不需要通过逐个交换值在内存中分配整个数组:
|
3
4
因为S和TMP都是内存地址。如果您s=tmp,两个指针将指向同一个数组。 假设我们有
在s=tmp之后
即使两个数组都有相同的数据,TMP中的更改也会影响这两个数组,因为两个数组实际上是相同的。它们都包含在同一内存地址中的数据。因此,通过改变TMP阵列的任何位置,或破坏TMP阵列,S也会受到同样的影响。 通过在数组上循环,您要做的是将一段数据从一个内存地址移动到另一个内存地址。 在我的K&R副本中,第4章解释了指针。快速浏览第一页可能会有所帮助。 |
4
1
为了使讨论更为全面,这里还有两种可能的方法可以作为字符串进行反转:
或递归地:
|
5
0
因为tmp是一个指针,你需要一个副本,而不是一个“链接”。 |
6
0
在s=tmp的情况下,作为数组起始地址的tmp的值将被复制到s。 这样,S和TMP都会指向内存中相同的地址,我认为这不是目的。 干杯 |
7
0
尝试试验,看看当你这样做时会发生什么:
当您直接在
当您在中修改数组中的值时,
|
8
0
这个线程中有一个关于数组和指针的有趣的子线程 我发现 this link 在维基百科上,有一个特殊的代码片段,显示了“橡皮泥”C是如何的!
当然,在C中更令人困惑的是,我可以这样做:
因此,指针和数组的互换性在C语言中似乎是如此的深刻,以至于几乎是有意的。
——原岗位---
确保你完全掌握了这三个概念,你不会走错太远。
希望能有所帮助,继续前进! |
9
-2
一个非常直接的答案是- s和tmp都是指向内存位置的指针,而不是数组本身。 换句话说,s和tmp是存储数组值的内存地址,而不是值本身。 访问这些数组值的常见方法之一是使用s[0]或tmp[0]等索引。 现在,如果您尝试简单地复制,s=tmp,tmp数组的内存地址将被复制到s。这意味着,原来的s数组将丢失,甚至s内存指针现在将指向tmp数组。 随着时间的推移,你会很好地理解这些概念,所以继续阅读这本书。 我希望这个基本的解释有帮助。 |
Community wiki · C中有哪些耗时的操作? 1 年前 |
Community wiki · 将所有处理器电源都投入到任务中 1 年前 |
Community wiki · C++为C添加了什么?[已关闭] 1 年前 |
Community wiki · 打印1到1000,不带循环或条件 1 年前 |