震惊的事实--数组与指针不相同?

△两个问题

问题1:

分析:

#include <stdio.h>
void main()
{
char a[]="happylife";
char * p = a;

printf(" a ----- %x \n",&a);
printf(" p ----- %x \n",&p);
}

输出的结果会相同吗?

运行结果:

都是指向了数组首地址,结果为什么不一样呢?

这个问题足以说明数组和指针并不相同。

问题2:

假如文件1中定义了一个数组a:

/******文件1****/

int a[5]={0};

/***************/

在文件2中想调用数组a,这个时候我们必须声明a

/******文件2****/

extern int * a;

/***************/

这时候我们发现程序无法运行,但我们把声明改为extern
int a[];就可以正常运行了,为什么呢?

究其为什么不同?

用问题1中程序解释

当我们取a[4]与p[4]时都能得到‘y’字符,但编译器提取字符的方式不同

当我们定义数组a时,a的地址12ff3c的即为数组第一个元素的地址,当运行a[4]时,编译器知道a是一个数组名,就取(12ff3c+4)的内容;

当我们定义指针变量p时,编译器开辟一个空间存变量p,空间首地址为12ff38,当运行p[4]时,先取其保存的内容12ff3c,然后取(12ff3c+4)的内容。多了一次提取内容的操作!

如果上面看懂了,这样我们就不难解释问题2的疑惑了,当在文件1中定义了一个数组,在文件2中申明它是一个指针,如果运行a[4],按照上面的方法,它会把字符‘y’当做一个地址,再一次取其内容,这样错的很惨!

什么时候相同?

1.在表达中,a[i]编译器都会解释为*(a+i)形式 (这也是我们容易把指针和数组混淆为相同的原因)

2.作为函数参数时,无论写成指针形式还是数组形式,编译器都会把他当做指向数组第一个元素的指针。

因为在函数内部,始终当成指针访问,不会管到底输入的是数组还是指针。

★重点终结★:

1.  无论什么时候,我们定义成什么,就应该申明什么,不能混用,因为直接影响编译器解释!

2.  sizeof()使用:sizeof(a)得到 10

                  sizeof  (p)  得到 4    这也是数组名和指针的不同之处

3.   可以执行p++;

     但不能执行a++;    因为a只是个数组名,它不能作为左值被赋值~!

时间: 2024-11-08 03:09:56

震惊的事实--数组与指针不相同?的相关文章

《C专家编程》第四章——令人震惊的事实:数组和指针并不相同

数组和指针是C语言里相当重要的两部分内容,也是新手程序员最容易搞混的两个地方,本章我们锁定指针与数组,探讨它们的异同点. 首先来看指针与数组在声明上的区别: int a[10]; int *p; 很明显的,第一个是数组a,第二个是指针p.下一个问题是a的类型是什么?p的类型是什么?a[0]的类型是int,而a是个数组名,它是否表示整个数组呢?事实并非如此,a是一个指针常量,是一个指向int的指针常量,而p是一个指向int的指针,是一个变量.这是它们的第一个区别:一个是常量,一个是变量.那么常量和

深刻理解C语言:数组和指针

参考<C专家编程>的下列章节: 第4章 令人震惊的事实:数组和指针并不相同 第9章 再论数组 第10章 再论指针 数组名的理解: int a[10]; 1. a代表指向第一个数组元素的指针.做函数形参时,在表达式中时. 2. a看成一个整体.a的数据类型是int[10].因此a取地址后加一的步长为40 视频参考: 指针及指针操作 数组 高级指针.C.面向对象

第一章 数组与指针概念剖析

数组与指针生来就是双胞胎,多数人就是从数组的学习开始指针的旅程的.在学习的过程中,很自然就会经常听到或见到关于数组与指针的各种各样的看法,下面我节选一些在各种论坛和文章里经常见到的文字: “一维数组是一级指针” “二维数组是二级指针” “数组名是一个常量指针” “数组名是一个指针常量” ........................ 这些文字看起来非常熟悉吧?类似的文字还有许多.不过非常遗憾,这些文字都是错误的,实际上数组名永远都不是指针!这个结论也许会让你震惊,但它的确是事实.但是,在论述这

C数组和指针

C数组和指针 C语言中的指针与数组这两个概念之间的联系是如此的紧密,以至于如果不能理解一个概念,就无法彻底理解另一个概念.且C对这些概念的处理与其他语言都有所不同. 1,C语言中只有一维数组,并且数组的大小必须在编译期间就作为一个常数确定下来.由于C语言中的数组的元素可以是任何的类型,当然也可以是另外的一个数组,因此可以“仿真”出多维数组. 2,对于一个数组,我们只能够做两件事:确定该数组的大小,以及获得指向该数组下标为0的元素的指针.其他有关数组的所有操作实际上都是通过指针进行的,哪怕看起来再

C/C++数组和指针详解

/****************************************************************/ /*            学习是合作和分享式的! /* Author:Atlas                    Email:[email protected] /*  转载请注明本文出处: *  http://blog.csdn.net/wdzxl198/article/details/9087497 /*************************

c数组与指针

0.数组和指针并不是相同的 我们声明数组时,同时分配了一些内存空间,用于容纳数组元素,但是当我们声明一个指针时,只分配了用于容纳指针本身的内存空间. 从这个方面也可以理解sizeof后面跟数组名和指针名的不同. 什么时候数组和指针相同呢? c语言标准对此做了如下说明 规则1.表达式中的数组名被编译器当作一个指向该数组的一个元素的指针 规则2.下标总是与指针和偏移量相同 规则3.在函数参数的声明中(形式参数),数组名被编译器当作指向该数组第一个元素的指针 1.数组名是一个常量指针,并不是一个左值

基于arm的C++反汇编 数组和指针的寻址

数组在函数内 数组作为参数 数组作为返回值 下标寻址和指针寻址 下标值为整型常量的寻址 下标值为整型变量的寻址 下标值为整型表达式的寻址 数组越界 多维数组 存放指针类型数据的数组 指向数组的指针变量 函数指针 ??虽然数组和指针都是针对地址操作,但它们有许多不同之处.数组是相同数据类型的数 据集合,以线性方式连续存储在内存中:而指针只是一个保存地址值的4字节变量.在使用中,数组名是一个地址常量值,保存数组首元素地址不可修改,只能以此为基地址访问内 存数据:而指针却是一个变量,只要修改指针中所保

数组和指针的关系

数组名本身就是地址或指针值,数组和指针都可以通过下标来访问.尽管指针和数组在访问内存的方式上几乎是相同的,但它们还是有区别的.指针变量可以取不同的地址作为它的值,但数组本身就是个地址,它是固定的. 假设a是个数组,i是个int变量.有一个基本的事实是: a[i] 相当于 *(a + i) 表达式a[i]的值就是数组第i个元素(从0开始计数)的值,而*(a + i)是对表达式a + i进行解引用.后者是个指针表达式,指向a之后的第i个元素的位置. 这意味着我们可以在指针中使用数组记法. 当一个数组

数组与指针的区别?

数组要么在静态存储区被创建(如全局数组),要么在栈上被创建.指针可以随时指向任意类型的内存块.    (1)修改内容上的差别 char a[] = "hello";  //它们有各自的内存空间:a[0] = 'X';char *p = "world"; // 注意p 指向常量字符串p[0] = 'X'; // 编译器不能发现该错误,运行时错误 (2) 用运算符sizeof 可以计算出数组的容量(字节数).sizeof(p),p 为指针得到的是一个 指针变量的字节数,