extern int *a与extern int a[]

extern int *a与int a[]

Table of Contents

  • 1. 问题:
  • 2. 解答:

1 问题:

下面的声明取自某个源文件:

int a[10];
int *b=a;

但在另一个不同的源文件中,却发现了这样的代码:

extern int *a;
extern int b[];
int x,y;
x=a[3];
y=b[3];

请解释,当两条赋值语句执行时会发生什么?

2 解答:

  1. 指针是变量,系统会为每个变量开辟存储空间,包括指针变量
  2. 数组名神似指针,一些情况下可视为指向数组第一个元素的指针(所以定义的数组声明时被声明为指针也是可以的,只不过声明文件中代表指针用了),但是实际上数组名是"实实在在"的"地址",表示的是存储数组元素的空间的起始位置,系统不会为数组名本身开辟存储空间(&数组名得到的地址还是数组名)
  3. 对待一个变量i,取出变量的内容步骤可以视为:1).找到变量i的地址(&i) 2).取出&i地址起i类型那么大空间的内容作为变量i的值

在第一个赋值中,编译器认为a是一个指针变量,所以它提取存储在那里的指针值,并加上12(3和整型的长度相乘),然后对这个结果执行间接访问操作。但a实际上是整型数组的起始位置,所以作为"指针"获得的这个值实际上是数组的第一个整形元素。它与12相加,其结果解释为一个地址,然后对它进行间接访问。作为结果,它或者将提取一些任意内存位置的内容,或者由于某种地址错误而导致程序失败。

在第2个赋值中,编译器认为b是个数组名,所以它把12加到b的存储地址,然后间接访问操作从那里获取的值。事实上,b是个指针变量,所以从内存中提取的后面的第三个int实际上是从另外的任意变量中取得的,这个问题说明了指针和数组虽然存在关联,但绝不是相同的。

Author: kirchhoff

Created: 2014-11-10 Mon 22:13

Emacs 24.4.1 (Org mode 8.2.10)

Validate

时间: 2024-10-07 16:15:50

extern int *a与extern int a[]的相关文章

C语言复杂声明-void (*signal(int sig, void (*handler)(int)))(int);

问题提出 请分析此声明:void (*signal(int sig, void (*handler)(int)))(int); 求解过程 在对上面的例子作分析之前,我们需要了解C语言的声明优先级,<C专家编程>P64原文如下: 规则A规定了要按照优先级来解释声明(算是一句废话).规则C请参照本人上一篇笔记:http://www.cnblogs.com/deyuanqin/p/5705967.html.规则B的具体实践过程如下图: 本着抛砖引玉的目的,我们使用以上规则分析void (*signa

int *p,cons int *p,int const *p,int * const p,const int * const p,int const * const p的区别

 加有const关键字的几种情况的辨析 const修饰的代码 含义(特点) 等价性 int *p = &num; 1.       可以读自己 2.       可以通过*p改自己 3.       可以通过p = &data来看别人 权限最大 cons int *p = &num; 1.const放在左边意味着指向的是常量,这个常量不可以修改, 2.p = &data; (地址可以修改) 3.*p = 30;(这个时候是错误的) 这两者等价(应用:查看别人的账户) i

关于int &amp;const t和 int const&amp; t

#include<iostream.h> #include<stdio.h> int main() { int i = 0; int const& j = i; int & const t = i; const int& m = i; i = 3; printf("j = %d m = %d  t = %d i = %d &j = %d &m = %d &t = %d",j,m,t,i,&j,&m,

int * const 和 const int *

It's not the same. The const modifier can be applied to the value, or the pointer to the value. int * const A constant pointer (not modifiable) to an integer (its value can be modified) const int * A modifiable pointer to a constant integer (its valu

【C语言】【笔试题】编写一个函数itob(int n,char s[], int b),将整数n转换为以b进制的数。保存到s中。

#include <stdio.h> static int i=0; int itob(int n,char s[],int b) { if(n<2) { s[i]=n+'0'; } else { itob(n/2,s,b); //递归 i++; n=n%2; s[i]=n+'0'; } s[i+1]='\0';//结束标志 return 0; } int main () { char s[20]; int num=0; scanf("%d",&num); i

如何理解这段代码:void (*signal (int sinno,void(*func)(int)))(int)

void (*signal (int sinno,void(*func)(int)))(int) 先来看void(*func)(int)   这里的意思是声明一个函数指针func,它的参数类型为int,参数名可省略不写,当然(int x)也没错. 声明一个函数指针signal,他有两个参数,int sinno,和一个函数指针参数void(*func)(int). signal函数有自己的参数类型int,省略了参数名:void (*signal (int sinno,void(*func)(int

C++中(int&amp;)和(int)的区别

在说这个问题之前,先说两个需要知道的背景知识: (1)语言的类型的强制转换不会修改原来的数据,会另外的开辟一个临时的或者程序中指定的空间来存储强制转换后的值. (2)C++引用的实现是在符号表中动了手脚,把自己的变量符号对应的内存地址写成了它所引用的那个变量的内存地址了. (3)C++的cout函数的执行,是根据变量的名称找到对应的内存地址,然后根据变量的类型从内存中抓取相应的数据. 有了上面的两个知识点,看下面的程序: #include <iostream> using namespace

数组冒泡排序,文件读取,数据库读取,string类型的int数组转换成int数组

排序方式(枚举) 1 public enum SortBy 2 { 3 Asc, 4 Desc 5 } 数组冒泡排序方法 1 public class SortEntity 2 { 3 public static int[] SortArray(int[] array,SortBy sortby) 4 { 5 int flag; 6 switch (sortby) 7 { 8 case SortBy.Asc: 9 for (int i = 0; i < array.Length - 1; i++

【详解】C语言:编写一个函数itob(int n,char s[], int b),将整数n转换为以b进制的数。保存到s中。

#include<stdio.h> void itob(int n,char s[], int b) {  int i=1;  for(;i<=32;i++)    //共循环了32次,保证得到32位的二进制数  {   s[i-1]= n % b;   //数组是从编号0开始的,一直到编号31结束   n = n/b ; //用模除的方法依次得到每位进制数  }  for(i=32;i>0;i--)  {   printf("%d",s[i-1]);   }