arr指针和arr表示法之间的区别

时间:2017-04-11 18:17:46

标签: c pointers

(在C中)有什么区别

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-slider/9.7.3/css/bootstrap-slider.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-slider/9.7.3/bootstrap-slider.min.js"></script>


<div class="col-sm-6">
    <h2>Pros</h2>
    <p>The Good Stuff</p>
    <form id="proForm" onkeypress="return event.keyCode != 13;">
        <input class="form-control text-left pro-con-input" id="proInput" placeholder="Add New Benefit"/>
        <div onclick="newAdd('pro')" class="btn pro-con-btn">Add</div>
    </form>
    <h3 class="text-left">Benefits</h3>
    <ul class="text-left" id="proList">
    </ul>
</div> <!-- pros -->

<div class="col-sm-6">
    <h2>Cons</h2>
    <p>The Bad Stuff</p>
    <form id="conForm" onkeypress="return event.keyCode != 13;">
        <input class="form-control text-left pro-con-input" id="conInput" placeholder="Add New Benefit"/>
        <div onclick="newAdd('con')" class="btn pro-con-btn">Add</div>
    </form>
    <h3 class="text-left">Costs</h3>
    <ul class="text-left" id="conList">
    </ul>
</div>

假设我们做了int * a int [] a;

第二个也不是指针吗?

2 个答案:

答案 0 :(得分:0)

现在看来,第二个只是语法错误。你可以做的最接近的是int a[];即使这样,但是,允许 - 对于变量定义,括号需要包含一个带有严格正值的常量表达式。

对于函数参数,将允许int a[],因此int a[3]也是如此。在这种情况下,两者是完全等效的 - 当您使用类型array of T定义函数参数时,它会调整为类型pointer to T

您还可以执行 extern 声明:

extern int *a;
extern int b[];

在这种情况下,这两个实际上在语法上都是有效的,但结果是不同的 - 您声明a具有类型pointer to int,而b具有类型{{ 1}}。

如果在表达式中计算数组的名称,它通常会产生该数组的第一个元素的地址(尽管有一些例外,例如当用作array of int的参数时) 。虽然数组本身没有那种类型 - 你所看到的至少类似于隐式转换,有点类似于sizeof,将2 + 10.0转换为2在添加之前 - double本身是2,但在此表达式中,它会以静默方式转换为int

答案 1 :(得分:0)

我认为你的意思是以下声明之间的区别

int a[N];

int *a = malloc( N * sizeof( int ) );

其中N是一个整数值。

第一个声明一个具有静态或自动存储持续时间的数组。第二个做两件事。其初始化表达式分配动态内存,该内存可由具有N类型int元素的数组占用。并且内存范围的地址被分配给指针a。 当用户不再需要时,应该释放分配的内存。

因此,在第一个声明中声明了一个类型为int[N]的对象,而在第二个声明中声明了一个类型为int *的对象。相应地,第一个对象的大小等于sizeof( int[N] ),等于N * sizeof( int ),而第二个对象的大小等于sizeof( int * )

指针不具备关于它们是指向单个对象还是指向数组的第一个对象的信息。因此,用户应该自己保留已分配数组的元素数,而对于数组,可以使用表达式sizeof( a ) / sizeof( *a )来获取数字。