当前位置:  开发笔记 > 编程语言 > 正文

如何在C中处理指针?

如何解决《如何在C中处理指针?》经验,为你挑选了2个好方法。

我是C的新手,我在学习指针方面遇到了一些问题.我试验了交换,这就是我能用它做的所有:)我知道每个变量在内存单元中都有自己的地址(这是我的讲师告诉我们的),每个变量的值都可以通过转到它的相关地址来获得获取存储在其中的值.我见过一些函数头文件,例如:

int doSomething(char **hihi);

我的头很困惑.我知道指针也是一个变量,它只在地址信息中存储地址信息.我读到它们与数组密切相关

arr = &arr[0];

这就是我对指针的了解,我想知道如何加深我对指针的看法.我搜索网,我找不到任何有用的备忘单覆盖指针.而且我也想知道它们为什么如此重要,有没有办法在不使用printf()打印地址(p)和值(\*p)的情况下理解实际发生了什么?



1> Steve Jessop..:

打印地址和值是查看它们的合理方法.但是,如果你可以启动并运行调试器,那就更好了,因为你可以更快地跟踪指针,看着它们在你步进时改变,等等.

如果您熟悉Windows中的"快捷方式"或Linux文件系统中的软链接,那么就像您开始时一样,将指针视为另一个对象的快捷方式(软链接)可能会有所帮助(无论该对象是否对象)是一个结构,一个内置类型,另一个指针等).

快捷方式仍然是文件.它占用磁盘驱动器上自己的空间,它引用另一个文件,可以修改它以引用与以前不同的文件文件.类似地,C中的指针是占用内存的对象,包含另一个内存位置的地址,并且可以通过分配给它来更改为包含不同的地址.

一个区别是,如果双击快捷方式,它的行为就像双击它指向的东西一样.指针不是这种情况 - 你总是必须用"*"或" - >"明确地取消引用一个指针才能访问它所指向的东西.另一个不同之处在于指向指向C中指针的指针是很常见的.

至于行话,你不得不学习它."int doSomething(char**hihi)"表示"一个名为doS​​omething的函数,它返回一个整数,并将一个指向char的指针作为参数".关键的一点是" char ** hihi"表示"指向指针指向char的指针.我们将指向指针指向char hihi".你说hihi的"类型"是char**,并且*hihi的"类型"(当你取消引用指针时得到的)是char*,**hihi的类型是char.

经常在C中,指向char的指针意味着一个字符串(换句话说,它是一个指向NUL终止数组中第一个字符的指针).因此,"char*"通常意味着"字符串",但它不必.它可能只是指向一个char的指针.有点像Windows中1字节文件的快捷方式(好吧,无论如何都是FAT32),指向C中的char的指针实际上大于它所指向的东西:-)

同样,char**通常不仅指向一个字符串指针的指针,而且指一个字符串指针数组.它可能没有,但如果确实如此,那么下面的小图片可能会有所帮助:

hihi
 ____            ____                     ________     _________      _______
|____|   -----> |____|  *hihi       ---> |___A____|   |___B_____|    |___C___|
                |____|  *(hihi+1)   ------------------^              ^
                |____|  *(hihi+2)   ---------------------------------|
                | ...|    etc.

hihi指向塔块的努力,这是我表示一系列指针的方式.正如你已经注意到的那样,我可以用hihi [0]代替*hihi,hihi [1]来代替*(hihi + 1),依此类推.

这是一个连续的内存块,它的每个指针大小的块包含另一个内存块的地址(即,它"指向"),包含一个或多个字符的goodness-know-where.因此,hihi [0]是字符串A的第一个字符的地址,hihi [1]是字符串B的第一个字符的地址.

如果hihi没有指向一个阵列,只有一个指针,那么塔楼就是一个平房.同样,如果*hihi没有指向一个字符串,只有一个字符,那么长细块就是一个正方形.你可能会问,"我怎么知道塔楼有多少层?".这在C编程中是一个大问题 - 通常是函数文档会告诉你(它可能会说"1",或"12",或"足够你告诉我要做的事情",否则你会通过作为额外参数的楼层数,或者文档会告诉你数组是"NULL终止",这意味着它将继续读取,直到它看到地址/值为NULL,然后停止.主函数实际上同时执行第二和第三件事 - argc包含参数的数量, 为了安全起见,argv以NULL结尾.

因此,每当您看到指针参数时,您必须查看该函数的文档,以查看它是否需要指向数组的指针,如果是,那么该数组必须有多大.如果你不小心这个,你会创建一种称为"缓冲区溢出"的错误,其中一个函数期望一个指向一个大数组的指针,你给它一个指向一个小数组的指针,然后它会乱写一下你给它的东西,并开始腐蚀记忆.



2> PolyThinker..:

我认为这是经典书籍比大多数在线资源更有用的地方.如果您可以获得副本,请非常仔细地阅读C编程语言(又名K&R).如果你想了解更多,请选择专家C编程:深层秘密(只需google).

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有