c语言数组!指针!字符数组的概念!
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*array是指针吗??
2. array[]. 与array(数组名)有什么区别??
3,我那个等价理解有问题吗??
前辈!
1 带有*号,说明array是一个指针型的变量,他的值是一个地址,
2 array[]是一个数组,他的数组名array就是他的首地址,而array(数组名),这是一个函数,他的形参是一个数组名,
至于你说的那个等价,是这样
int *array;
int array_1[10];
array=array_1;
那*array这个指针变量的值就是array_1这个数组的首地址。
我还没问完!我有这样的一个理解*ptr与var等价
ptr与&var等价!
后来看完一段代码又说*array与array[]等价?*array代表的不是变量吗?书上的意思是这两都是指向int变的指针!我哪里理解错了?
是char *array 和char array[] 等价吧
是的!我那样写有错吗?
char *array 表示定义一个指针
*array表示解引用,就是array地址上的值
这两个不一样
char array[]表示定义一个数组,array是数组的指针
单个的概念都懂了!请重新看问题