当前位置: 首页 > 知识库问答 >
问题:

在C语言中,指针的数量限制是多少?[重复]

虞唯
2023-03-14

在C语言中,我知道我们可以用指针来实现这一点:

int *p;          /* an int pointer (ptr to an int) */
int **pp;        /* a pointer to an int pointer (ptr to a ptr to an int) */

甚至:

int **app[];            /* an array of pointers to int pointers */
int (**ppa)[];          /* a pointer to a pointer to an array of ints */
int (**ppf)();          /* a pointer to a pointer to a function returning an int */
int *(*pap)[];          /* a pointer to an array of int pointers */
int **fpp();            /* a function returning a pointer to an int pointer */

但我们能做点什么,比如三个指向无限的指针吗?例如。:

int ***ppp;             /* a pointer to a pointer to an int pointer */
int ****pppp;           /* a pointer to a pointer to a pointer to an int pointer */

...依此类推,直到无穷大。

指针的数量有上限吗?如果是,上限是多少?

共有2个答案

范楚
2023-03-14

C 11标准没有规定最大限度的限制,事实上,该标准规定“实现时应尽可能避免施加固定的翻译限制。”在脚注中。

最低限值由5.2.4环境限值给出:

实现应能够翻译和执行至少一个程序,其中至少包含以下每一个限制的一个实例:18)

  • 127个嵌套级别的块
  • 条件包含的63个嵌套级别
  • 12个指针、数组和函数声明符(任何组合)修改声明中的算术、结构、联合或空类型
  • 在一个完整的声明符中有63个嵌套级别的括号声明符
  • 完整表达式中63个括号表达式的嵌套级别
  • 内部标识符或宏名称中的63个重要初始字符(每个通用字符名称或扩展源字符被视为单个字符)
  • 外部标识符中的31个重要初始字符(每个指定短标识符为0000FFFF或更少的通用字符名称被视为6个字符,每个指定短标识符为00010000或更多的通用字符名称被视为10个字符,每个扩展源字符被视为与相应的通用字符名称相同的字符数,如果有的话)
  • 一个翻译单元中的4095个外部标识符
  • 511个标识符,在一个块中声明了块范围
  • 在一个预处理翻译单元中同时定义4095个宏标识符
  • 一个函数定义中的127个参数
  • 一个函数调用中的127个参数
  • 一个宏定义中的127个参数
  • 一个宏调用中的127个参数
  • 逻辑源行中的4095个字符
  • 字符串文字中的4095个字符(连接后)
  • 对象中的65535个字节(仅在托管环境中)
  • #包含文件的15个嵌套级别
  • 开关语句的1023个大小写标签(不包括任何嵌套开关语句的大小写标签)
  • 单个结构或联合中的1023个成员
  • 单个枚举中的1023个枚举常量
  • 单个结构声明列表中的63级嵌套结构或联合定义

一个合格的C编译器将提供至少12级的指针间接寻址。

夹谷山
2023-03-14

本标准没有设定任何上限。它的意思是,一个编译器至少需要支持12个。

在实际代码中,它可以被认为是无限的。只有当你编写的程序编写的程序是人类永远不应该阅读的,这才是相关的。大多数程序员会说你应该把三星作为警告。没有真正好的理由,不要超过两颗星。

我在gcc上尝试了10000次,结果成功了。我现在想用10万美元。一件有趣的事情是编译需要非常长的时间。编译花了几分钟时间,唯一的语句是一个带有10000个星星的指针声明。

生成C文件的代码:

// gen.c
#include <stdio.h>

int main()
{
    const size_t n = 10000;
    printf("int main(){int ");
    for(size_t i=0; i<n; i++)
        printf("*");
    printf("p;}\n");
}

运行:

$ gcc gen.c -c gen
$ ./gen > stars.c
$ gcc stars.c

对评论的答复:

这是一个有趣的实验,但我不会进一步研究。

 类似资料:
  • 多级指针概述 我们将指针变量理解为一个存储地址的变量。如果这个地址里面存储的依然是地址,那么我们就可以定义一个二维指针。通过一个二维指针,我们通过两次寻址操作就可以找到这个值。 比如我们定义一个int **p;这是一个二维指针,当编译器看到p的时候,它知道这是一个指针变量,指向一个地址;当它看到第二个的时候,它知道指向的地址里面依然还是地址。如下图所示: 如果我们将p[0]和p[1]分别指向两个字

  • 本文向大家介绍详解C语言中的常量指针和指针常量,包括了详解C语言中的常量指针和指针常量的使用技巧和注意事项,需要的朋友参考一下 概述 对于新手来说,指针在c语言里总是一个非常难以理解的概念。在这篇文章中,我们将解释常量指针,指针常量,const pointer to const(ps:楼主以为这可以翻译成指向常量的常量指针)的区别 常量指针 让我们先来理解什么是常量指针。常量指针是指指针指向的地址

  • C 语言的指针常常被人们认为是 C 语言中的灵魂所在,可以完成很多高难度的操作。但是更多的人感觉 C 语言的指针的存在如同噩梦一般,因为稍不注意,就会引起灾难性的后果。 不管你是不是喜欢 C 语言中的指针,我们都要学习这种看起来很神奇的东西。因为指针这个概念不是 C 语言首创的,而是苏联的计算机科学家首创的。 1. 什么是指针? 指针是什么?这是来自灵魂的拷问。其实指针也是一种变量。我们之前也说过

  • 指针变量保存的是地址,而地址本质上是一个整数,所以指针变量可以进行部分运算,例如加法、减法、比较等,请看下面的代码: 运行结果: 从运算结果可以看出:pa、pb、pc 每次加 1,它们的地址分别增加 4、8、1,正好是 int、double、char 类型的长度;减 2 时,地址分别减少 8、16、2,正好是 int、double、char 类型长度的 2 倍。 这很奇怪,指针变量加减运算的结果跟

  • 问题内容: 我想知道我可以发送到SQL Server的UNION SELECT语句的数量是否受到限制?在一条SQL语句中,我最多可能要完成36个操作,因此它变得相当长,从字符角度来看。(而且,其中每个带有ASE WHEN语句的SELECT语句本身都有些复杂。) 问题答案: 从SQL 2008 BOL “ Transact-SQL语句中可以出现任意数量的UNION运算符” 同样来自MSDN “ SQ

  • 多级指针举例 可能很多同学都执行过这个命令,ping www.baidu.com或者是ping www.qq.com,ping是一个命令,后面的网址就是它的传入参数。不同的参数会导致不同的运行结果。 下面就是我们main函数的标准写法,argc就是传入参数的个数,argv是一个字符串类型的二维指针。当我们需要传递下面四个字符串给main函数的时候,这四个是字符串的首地址不是连续的,我们就可以使用二