- 浏览: 38823 次
- 性别:
- 来自: 上海
最新评论
看《C专家编程》总结的的。
首先是个经典的例子:
一个文件定义:
char a[4];
另一个文件声明:
extern char* a;
或者
extern char a[];
这两种声明会有什么后果?编译器是怎样的处理?
下面说明。
一.声明和定义的概念
一个变量和函数,定义只能有一次,但是声明却可以多次。
定义:确定对象的类型并分配了内存。
声明:描述了对象的类型,用于指代其他地方定义的对象。
二.数组和指针编译器的处理方式
1.首先明白左值和右值
X = Y;
在这个情况下:
符号X的含义是X所代表的地址,这被称为左值。在编译时可以。
符号Y的含义是Y所代表的地址的内容。这被称为右值。右值在运行时候才知道
数组名是不可修改的左值。
2.数组和指针的不同访问方式
编译器为每个变量分配一个地址。这个地址在编译时候可知,而且运行时候一直保存这个地址。而保存在变量中的值只有在运行才知道。
这里的关键是:
每个符号的地址,在编译时可知。编译器需要一个地址(有时候还需要加上偏移量)的时候,它直接操作。
而指针必须在运行时刻,先取得指针里的地址,然后才能解引用,比数组多了一个取址操作。
例子:
char a[4]="abc";
c= a[i];
数组:
编译器符号表具有一个地址:9980(数组的起始地址)
运行时刻:
步骤1:取i的值,将它与编译器所保存的地址9980相加
步骤2:取地址(9980+i)的内容。
指针:
声明为:
extern char *p;
这将告诉编译器p是个指针,其所指的内容是个字符,为了取得这个字符,需要比数组多一个步骤。
char *p =a;
c= p[i];需要三步
运行时刻:
编译器符号表有一个符号p,它的地址位4624
步骤1.取地址4624的内容 也就是 9980
步骤2.5081内容加上偏移量i形成一个新的地址
步骤3.取步骤2中形成的地址的内容
三.结论
开头的那个例子
如果一个数组
char a[4];
被声明为:
extern char * a;
c= a[i]
运行时刻:
1.取符号表a的地址所指向的内容(数组的第一个元素)
2.将第一个步骤的数据加上偏移量形成一个新的地址。
3.访问这个地址的内容
看到了么?!
把数组第一个元素的内容当做地址,预期未知!!
最好的结果就是程序崩溃!
由上面我们还可以知道数组声明的时候,不需要指定大小。
理由:
1.声明的时候不分配内存,不需要大小信息。
2.访问数组成员的时候,是首地址+偏移量,不需要大小。
四.其他的区别
1.在ANSI C中 ,初始化指针的字符串被定义为只读。
而数组是可以修改的。
首先是个经典的例子:
一个文件定义:
char a[4];
另一个文件声明:
extern char* a;
或者
extern char a[];
这两种声明会有什么后果?编译器是怎样的处理?
下面说明。
一.声明和定义的概念
一个变量和函数,定义只能有一次,但是声明却可以多次。
定义:确定对象的类型并分配了内存。
声明:描述了对象的类型,用于指代其他地方定义的对象。
二.数组和指针编译器的处理方式
1.首先明白左值和右值
X = Y;
在这个情况下:
符号X的含义是X所代表的地址,这被称为左值。在编译时可以。
符号Y的含义是Y所代表的地址的内容。这被称为右值。右值在运行时候才知道
数组名是不可修改的左值。
2.数组和指针的不同访问方式
编译器为每个变量分配一个地址。这个地址在编译时候可知,而且运行时候一直保存这个地址。而保存在变量中的值只有在运行才知道。
这里的关键是:
每个符号的地址,在编译时可知。编译器需要一个地址(有时候还需要加上偏移量)的时候,它直接操作。
而指针必须在运行时刻,先取得指针里的地址,然后才能解引用,比数组多了一个取址操作。
例子:
char a[4]="abc";
c= a[i];
数组:
编译器符号表具有一个地址:9980(数组的起始地址)
运行时刻:
步骤1:取i的值,将它与编译器所保存的地址9980相加
步骤2:取地址(9980+i)的内容。
指针:
声明为:
extern char *p;
这将告诉编译器p是个指针,其所指的内容是个字符,为了取得这个字符,需要比数组多一个步骤。
char *p =a;
c= p[i];需要三步
运行时刻:
编译器符号表有一个符号p,它的地址位4624
步骤1.取地址4624的内容 也就是 9980
步骤2.5081内容加上偏移量i形成一个新的地址
步骤3.取步骤2中形成的地址的内容
三.结论
开头的那个例子
如果一个数组
char a[4];
被声明为:
extern char * a;
c= a[i]
运行时刻:
1.取符号表a的地址所指向的内容(数组的第一个元素)
2.将第一个步骤的数据加上偏移量形成一个新的地址。
3.访问这个地址的内容
看到了么?!
把数组第一个元素的内容当做地址,预期未知!!
最好的结果就是程序崩溃!
由上面我们还可以知道数组声明的时候,不需要指定大小。
理由:
1.声明的时候不分配内存,不需要大小信息。
2.访问数组成员的时候,是首地址+偏移量,不需要大小。
四.其他的区别
1.在ANSI C中 ,初始化指针的字符串被定义为只读。
而数组是可以修改的。
发表评论
-
指针 多维数组
2012-06-05 16:12 721这篇文章写的很好 http://www.cnblogs.com ... -
pImp
2011-11-08 17:24 865http://www.cnblogs.com/JulyZhan ... -
关于构造函数,析构函数,explicit等内容
2011-11-01 17:04 1222一.编译器会为我们做什 ... -
C语言标准
2011-10-21 12:11 12221.K&R C 1978年,丹尼斯·里奇(Dennis ... -
对话框工厂
2011-10-14 18:00 6711.对于工厂我的理解: 良好的封装性。使用和创建,初始化分开。 ... -
函数指针实现回掉函数
2011-10-14 17:47 969用法: 头文件中声明: DECL_LINK( Paintin ... -
typedef和指针结合
2011-10-14 17:42 8031. typedef (int *) pInt; 2.type ... -
const的理解和应用
2011-10-14 16:52 1326const的理解和应用 一.理解 const是一种语义上的约束 ... -
空指针的判断
2011-10-11 17:43 929请看NULL的定义: #if !defined(__cp ... -
GUN C 和 ANSI C的几个区别
2011-10-11 10:52 1104http://hi.baidu.com/deep_pro/bl ... -
浮点数的比较
2011-10-11 10:48 1241一浮点数的知识 1.首先浮点数不用补码表示,只有int型才用补 ... -
关于字符串倒转
2011-10-10 20:25 789有纯倒转,也有按单词为单位的。想做个总结 #inclu ... -
不用中间变量交换数据
2011-10-10 14:42 666那种加加减减的方法其实不对。因为缩小了数据范围。 a1=a1+ ... -
C++模板
2011-10-08 15:52 650template是关键字,template ... -
Quick Sort(快速排序)
2011-10-08 11:20 697Quick Sort算法描述如下: 假设S代表将被处理的序列 ... -
约瑟夫环的解答
2011-10-07 22:48 647http://blog.csdn.net/kittyjie/a ... -
Linux判断大小尾数(big-endian,little-endian)的方法
2011-10-07 22:12 1510static union { char c[4]; u ... -
c++基本文件操作
2011-09-30 00:28 780#include<iostream> #incl ... -
关于文件操作的头文件,类
2011-09-27 14:11 1097C++ 可以看这个 http://www.cplusplus. ... -
关于回车,换行,EOF
2011-09-26 17:41 2804回车换行: http://www.cnblogs.com/fa ...
相关推荐
在C/C++编程语言中,数组和指针是两种非常重要的数据结构。虽然它们在某些方面存在相似性,但本质上有着显著的区别。本文旨在澄清关于数组名是否等同于指针这一常见的误区,并通过具体的代码示例来深入探讨数组和...
在C语言中,数组名和指针之间存在微妙且重要的区别,这往往让初学者感到困惑。虽然在某些上下文中,它们看似可以互换使用,但深入理解它们的本质差异对于编写高效、安全的代码至关重要。 ### 一、数组名与指针的...
**多维数组指针:** ```c int (*p)[3]; // p是指向含有3个整型元素数组的指针 int (*p)[3] = &a; // 将数组a的地址赋给p ``` **函数指针:** 函数指针是一种特殊的指针类型,它可以存储函数的地址。 ```c int add...
《数组与指针的艺术》是一篇深度探讨C/C++中数组和指针特性的文章,旨在帮助读者理解和掌握这两种核心概念。文章指出,数组和指针是C/C++语言的灵魂,它们提供了对底层操作的强大支持,是语言效率的保证。然而,由于...
在C语言中,数组和指针是编程的基础概念,它们紧密相连,经常一起使用。本章节将深入探讨这两个核心主题,结合"常东超、吕宝志、郭来德"编著的《C语言程序设计》第六章中的例题,我们将深入理解它们的工作原理和应用...
数组和指针练习题目(精选) 在编程语言中,数组和指针是非常重要的概念,它们的应用非常广泛,理解基础是非常必要的。本节将通过多种练习题目来加深对数组和指针的理解。 指针基础 指针是一种特殊的变量,它可以...
总的来说,理解和熟练运用数组指针是掌握C语言的关键技能之一。它不仅能够帮助我们更有效地操作数组,还能在编写高效的代码时发挥重要作用。在深入学习C语言指针时,还会涉及到二级指针、指针数组、字符串指针、函数...
### C语言数组、指针与编程技巧 #### 一、数组的基本概念与使用方法 **数组**是一种数据结构,用于存储相同类型的多个元素。在C语言中,数组可以通过指定索引来访问其中的元素。 ##### 1.1 数组声明 数组的声明...
浅议C语言中数组和指针的互操作浅议C语言中数组和指针的互操作浅议C语言中数组和指针的互操作浅议C语言中数组和指针的互操作
掌握数组和指针的使用对于理解和编写高效的C语言程序至关重要。在实际编程中,理解它们的工作原理和相互作用,可以帮助我们更好地管理和操作数据,实现复杂的功能。因此,对这些基本概念的深入学习是每个C程序员的...
本文旨在深入探讨“数组”与“指针”的区别,通过对比分析来帮助读者更好地理解这两种数据类型的特点及其应用场景。 ### 数组 #### 定义 数组是一种线性数据结构,它由相同类型的数据元素组成,并按照一定的顺序...
在 C 语言中,数组指针和指针数组是两个容易混淆的概念,但它们之间有着巨大的区别。本文将详细讲解数组指针和指针数组的定义、内存布局、区别,并通过实例代码加深读者的理解。 一、指针数组和数组指针的定义 ...
C语言数组,指针
在编程世界中,C语言是一种基础且强大的编程语言,它以简洁、高效著称,而数组和指针是C语言中的核心概念。本教程将深入探讨数组和指针的使用,帮助你掌握这两个关键概念。 首先,我们来讨论“数组”。数组在C语言...
本篇文章详细讲解了指针、指针数组、数组指针、指针的指针等的应用,旨在帮助读者深入理解 C/C++ 语言中的数组和指针概念。 一、指针数组 指针数组是一个数组里存放的都是同一个类型的指针。例如,int *a[10]; 它...
在编程世界中,数组和指针是C/C++等低级语言的核心概念,它们的理解与熟练运用对于程序设计至关重要。本学习资料集包含了对数组和指针的深度解析,旨在帮助学习者彻底掌握这两个概念。 首先,我们来深入探讨数组。...
数组与指针应用详解,区别 数组名与指针的关系是 C/C++ 编程中的一大难点,许多程序员容易将数组名与指针混淆,认为数组名就是指针。然而,实际上数组名与指针有着本质的区别。 第一点,数组名不是指针。从 sizeof...
### C语言中的数组与指针 #### 二维数组与指针概述 在C语言中,二维数组是一种非常实用的数据结构,它可以被形象地理解为一个表格。与一维数组不同,二维数组允许我们在行和列两个维度上组织数据。本文将详细介绍...