c语言数组!指针!字符数组的概念!

我还没问完!我有这样的一个理解*ptr与var等价
ptr与&var等价!
后来看完一段代码又说*array与array[]等价?*array代表的不是变量吗?书上的意思是这两都是指向int变的指针!我哪里理解错了?

*array代表的不是变量,是对变量的引用;

c语言里:

举个例子: int *array;是对指针的声明, *array = 3;像这样出现在代码的表达式中是对指针指向变量的引用;

指针是指针,数组是数组,指针与数组是两个完全不同的数据结构,分别有自己的运算

指针一般的运算

    指针之间或指针与整数的相减(注:指针一般相加没有实际意义)

    2:就是上面例子中的引用(间接访问),用于指针指向变量的赋值或修改或参加表达式的运算;

    3.指针的赋值运算 int *array; int a = 4; array = &a;这是指对指针重新指定其指向变量的地址,也就是为指针赋值;因为指针也是一个变量,变量函数运行时会在内存为变量开辟内存空间,内存空间存储值,所以可以给指针赋值,指针值的合法值是代表了运行计算机平台的地址编码范围内的整数;

数组是一组相同类型数据元素的集合,在内存位置空间上连续;

要进行下面的讨论,要说明一点,指针和数组都是有类型的,数组的类型可以认为是其数据元素的类型,一般用于指针指向与其类型相匹配的数据元素,这里不相匹配的就不做讨论了;

用指针可以指向合法地址的任意一个位置(现代计算机地址一般是按字节为单位编址),所以就可以用指针指向数组,其实是指相了数组中某个数组元素;

不过指针与数组的混淆不是在此,在于c语言有一个特殊情况,那就是当数组作为函数参数时会退化成指向数组首地址(也就是数组第一个元素)的地址;

所以一般参数函数传递时需要传递数组的长度;例: int array[4];  void foo(int *array, int array_length);

这里有两个问题:

1.为什么会选择退化,这个是因为程序运行效率的问题,你想传递一个指针到函数快还是一块内存区域快(注:1,。指针在现在的X86平台一般是四个字节,2,传递参数到函数式内存拷贝的过程)

2.传参的过程是什么(建立一个参数副本接着拷贝实参值到参数副本的过程,不明白建议跟踪混编程序,了解函数压栈弹栈的过程)

还有一个问题,啊,纯手打累死了  >0.0<

至于字符数组就是数组了,元素类型为数组呀!我想你可能问的是字符数组与字符串的关系;

char array[4] = {'A', 'p', 'p', 'l', 'e'} ;  char *array = "Apple";大小不同

char array[4] = {'A', 'p', 'p', 'l', 'e', '\n'} ;  char *array = "Apple";大小相同

原因是char *array = "Apple";自动后面加一个'\n'用于判断是否是字符串的结尾;

“Apple”;算是一个常量字符串吧也就是一个常量字符数组,就是程序运行时字符串的值理论上是不允许改变的,因为程序运行时为其内存的分配在static区;

至于他与指针的关系这里说两点:

1,把其首地址赋值给字符指针的原因,由于其没名字也算是匿名数组的一种;为了对其引用就将首地址赋值给个一个字符指针;

2,对于其占用内存大小的判定:数组在申请时必须指定其大小(不谈C99新特性),这个常量字符串程序对其大小的判定在于什么呢,在于其要以'\n'结尾;

说了这么多不知道你明白没?我觉得学不好是老师的问题,这么简单的问题有几个老师没深入理解,修养不够,国内就这现状,理解透了的有不愿意教,懒得解释!悲哉我大中华,西方文明早已降,我们呢? 如果还用谭老的书,果断扔了,推荐两本书1,C&R《c program language》经典中的经典,c语言的圣经!例子你叫难懂,基本是unix系统的一些系统代码简化的,以此为标准!2.《c专家编程》很棒!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-26
*array是指针变量,它是值是一个地址,array[]是一个数组,他的数组名就是这个数组第一个位子的地址,用&符取地址的话,*array跟array[]的首地址是一样的,如果还不懂,建议把指针与数组这章再重看下。。追问

这样问吧!!!1*array是指针吗??
2. array[]. 与array(数组名)有什么区别??
3,我那个等价理解有问题吗??
前辈!

追答

1 带有*号,说明array是一个指针型的变量,他的值是一个地址,
2 array[]是一个数组,他的数组名array就是他的首地址,而array(数组名),这是一个函数,他的形参是一个数组名,
至于你说的那个等价,是这样
int *array;
int array_1[10];

array=array_1;

那*array这个指针变量的值就是array_1这个数组的首地址。

第2个回答  2013-10-26
如果始终不了解 那么就应该从汇编开始学 回头再学C语言 不用点就通了。追问

我还没问完!我有这样的一个理解*ptr与var等价
ptr与&var等价!
后来看完一段代码又说*array与array[]等价?*array代表的不是变量吗?书上的意思是这两都是指向int变的指针!我哪里理解错了?

第3个回答  2013-10-26
后来看完一段代码又说*array与array[]等价?*
是char *array 和char array[] 等价吧追问

是的!我那样写有错吗?

追答

char *array 表示定义一个指针

*array表示解引用,就是array地址上的值
这两个不一样
char array[]表示定义一个数组,array是数组的指针

第4个回答  2013-10-26
指针其实就是内存的地址。打个比喻:内存就好比一个摩天大厦,每个内存字节就是大厦里面的一个一个的房间,每个房间的房间号就是该内存的地址,当你写下char *d="Hello"; 时,计算机为你做了2件事,第一,帮你在该大厦预定了6个房间,用来放字符串"Hello",存放字符串中第一个字符“H”的房间号(即字符串的首地址,假设是506)就被存到了变量d里面了(所以变量d也称位指针变量,专门放地址的变量);第二,系统把这个房间的名字“d”(呵呵,这个名字是你定义变量起的)放在了其它房间(假设606).数组名实际就是存放数组第一个元素的首地址。比如:int a[4]={1,2,3,4}假设计算机系统将1,2,3,4分别放在了341,342,343,344,房间(即内存地址),则数组名a里存放的就是341,所以你输出printf(“%d",a[1])和输出printf("%d",*a)结果是一样的。前者是派服务员到341房间把1取出输出,后者是服务员喊:“314客人下来!”,然后1就颠颠自己跑出来了。追问

单个的概念都懂了!请重新看问题

相似回答
大家正在搜