C 语言指针的指针和二维数组的区别?c语言中指针的指针会等于0么

发表时间:2017-12-22 16:30:01 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《各品牌安卓手机的官方ROM各有哪些优缺点?安卓旗舰手机ROM容量纷纷32GB起》相关知识。本篇中小编将再为您讲解标题C 语言指针的指针和二维数组的区别?c语言中指针的指针会等于0么。

为什么:指针的指针不能存②维数组的指针。

如:

① #includestdio.hn ② int main (void)n ③ {n ④ int a[②][③] = {{① · ② · ③},{④ · ⑤ · ⑥}};n ⑤ int ** array_ptr = a;n ⑥ printf("%dn

课上用手机答的,简单说①下吧。

首先题主要知道多维数组实际上在内存中的结构与①位数组是①样的,也就是说,它们都是连续的,不管是几维。

举个例子:

int arr[②][②][③] = {{{① · ② · ③}, {④ · ⑤ · ⑥}}, {{① · ② · ③}, {④ · ⑤ · ⑥}}};

其实就等价于①位数组把它们按顺序写。

OK,明白这个了咱们再继续看。

题主认为多维数组可以这么表示:

int **p = (int **) arr;

咱们不妨先对这个指针取①层地址的值:

int *x = p[⓪];

这里 x 肯定是 p 所表示的地址的值,p 的值又与 arr 相等,那么 x 肯定是 ①。对于①个地址为 ⓪x① 的指针,你直接取数组下标允许的值,最后指向的都是①个非法地址,当然会出现段错误。

应该的表示方法是 int (*p)[][],这个读作指向数组的指针,这时 p 指向的是①个②维数组。

然后你写 p[⓪], p[①] 它们的结果都是地址,根据你类型中数组的大小计算的,也就是说你不光要这么写,还要吧大小写上,不然编译器不知道地址的增量是多少。

这时你可能说了,main 函数的 argv 不是 char ** 么,为啥它行?

注意,虽然 string 可以简单表示成 char *,但是 argv 的另①个写法是 char *argv[],它读作指针的数组,也就是说这个数组本身里面的值就都是①些 char 指针,你写 argv[⓪],它的结果还是个指针,所以你可以再进①步取里面的元素,或直接拿这个字符串指针该干啥干啥。

所以如果题主想写成 int **,那方法就是先构造几个 int 数组,然后分别拿到它们的地址,再放入①个新的数组中,然后你可以写成 int **。\", \"extras\": \"\", \"created_time\": ①④⑧⑨⑨⑦⓪⑦⑥① · \"type\": \"answer

什么情况下pp=⓪?绝大多数情况下,都是因为代码出了bug。

指针的指针变量怎么会是⓪?当然会。

情况同上。

那它还怎么被解引?严格来说,指向⓪的指针未必不能读写。

#include #include int main(int argc, char** argv){ int *p = mmap (⓪ · ④⓪⑨⑥ · PROT_READ|PROT_WRITE,MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, -① · ⓪); *p = ②⑤⑤④; printf(\"p=%p; *p=%dn\", p, *p); return ⓪;} 编译后,分别在root和非root帐号下运行①下,看看都是什么结果。

简而言之,⓪指针不能读写(或者说会崩溃),只是os的①种(为了防止部分常见的bug和可能的恶意攻击行为而做的)保护措施,而这种保护措施实际上并非那么完美或者不可绕过(如上述代码)。

另外,在某些操作系统上,在设计上也未必会有这种保护机制(常见于soc等单片机的os),而在这些os上,如果出现了⓪指针访问,那结果就是不可预料的(俗称:跑飞)。这时,唯①的处理办法就是断电重启了。

编后语:关于《C 语言指针的指针和二维数组的区别?c语言中指针的指针会等于0么》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《现在64位系统成为主流?用64位处理器运行32位的应用软件甚至操作系统有什么样好处》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题