`

数组名与指针

 
阅读更多
数组名:代表一个数组的首地址;
指针:指向某个变量的地址;

注意使用上的区别:
数组名相当于指针常量。指针则根据声明可以为指针变量。也就是说,指针变量的值可以改变,数组名指向地址不可能改变。
注意运行时的区别:
char *p="hello world"; char a[]="hello world"; 这两句话执行效果看上去差不多,但运行方式则有很大区别:p本身占据4字节的内存空间,它指向字符串常量hello world的首地址,这个常量在内存中存储占用了12字节,即“hello world\0”就是h的存储地址;a本身不占据空间,数组a[12]占据12字节空间(与字符串常量hello world同。
注意:计算:sizeof p = 4; sizeof a = 12*1 = 12<<0 = 12;
注意:p[4]=o, a[4]=o;但访问方式不同,p[4]访问方式:先从p的存储空间中取出存储的值,该值加4作为地址去取出存储的值为'o'; a[4]访问方式:a代表的地址加4作为新地址,取出该地址存储的值'o'。
注意:函数中把数组名作为指针传递,因此即使在实参中传入a,在函数中的sizeof a也等于4,而非数组长度乘以数组类型字节数。

等同的情况:
表达式中,函数参数中的数组名都被转化成指针。
所以对于int a[10], *p=a; p[2]和a[2]访问到的值是相同的(注意运行方式不同);
对于void func(int *p){...},调用时可以用func(a);

另外对于数组:
a[6]等价于6[a],虽然6[a]的写法比较晦涩,但合法,都表示将a作为指针加6后引用该地址内存储的值。
编译器自动把下标值乘以类型字节数以得到正确的步长。由于c变量占据空间分别为1,2,4,8,均为2的n次方,因此该乘法使用左移运算实现。
处理一维数组时,指针并不见得比数组更快。

实例:下面的程序展示了数组名作为实参传入函数的情况,请注意,函数参数只能是变量,因为实参要给它赋值!
注意:数组名作为实参传入函数,即使形参书写如同str[],但其实还是char *,形参书写str[]最好是代表形参只能传入数组首地址!!否则写char *比较好!

#include <stdio.h>

void pandstr(char str[]) {
	char *p = "other hello!";

	printf("str: %s, sizeof str=%d, strlen(str)=%d\n",
	   		str, sizeof str, strlen(str));
	str = p;
	printf("str:%s, sizeof str=%d, strlen(str)=%d\n",
	   		str, sizeof str, strlen(str));
}

int main(void)
{
	char str[] = "Hello!";

	pandstr(str);

	return 0;
}



运行结果如下:
引用

str: Hello!, sizeof str=4, strlen(str)=6
str:other hello!, sizeof str=4, strlen(str)=12
0
0
分享到:
评论

相关推荐

    C/C++数组名与指针区别深层探索

    ### C/C++数组名与指针的区别深层探索 在C/C++编程语言中,指针是一种非常重要的数据类型,它提供了直接访问内存地址的能力。数组名与指针之间存在着密切的关系,但它们并非完全相同。在很多情况下,数组名的行为...

    c语言中 数组名和指针的区别

    ### 一、数组名与指针的比较 #### 1.1 数组名不是指针 尽管在某些情境下,数组名可以像指针那样被使用,例如在传递给函数时,但实际上数组名并不等同于指针。数组名本质上是一个固定的内存地址,指向数组的第一个...

    C和C++中数组名与指针的区别.pdf

    ### C和C++中数组名与指针的区别 #### 数组名与指针的基本概念 在C和C++中,数组名与指针之间存在一些关键性的区别,这些区别对于理解这两种数据类型及其应用场景至关重要。 - **数组名**: 表示的是数组的起始...

    C_C++数组名与指针区别探索

    ### C/C++数组名与指针的区别探究 #### 引言 在C/C++编程语言中,指针是一个非常重要的概念。它不仅提供了强大的内存管理能力,还是理解更高级概念的基础之一。与此同时,数组也是这两种语言中不可或缺的一部分,...

    CC++数组名与指针区别深入探索

    ### CC++数组名与指针的区别深入探索 在C/C++编程语言中,数组和指针是两个重要的概念,它们虽然在某些情况下可以互换使用,但本质上有着明显的区别。本文将深入探讨C/C++中数组名与指针之间的区别,并通过具体的...

    数组与指针区别(很全面)

    尽管数组名与指针之间存在一定的相似性,但它们的本质差异不容忽视。正确理解和区分数组与指针的概念对于编写高效、可靠的C/C++程序至关重要。通过本文的探讨,希望能帮助读者更好地掌握这两种数据结构的特点,并在...

    数组与指针应用详解,区别

    数组名与指针的关系是 C/C++ 编程中的一大难点,许多程序员容易将数组名与指针混淆,认为数组名就是指针。然而,实际上数组名与指针有着本质的区别。 第一点,数组名不是指针。从 sizeof vận算符的返回值可以看出...

    C语言学习趣事20关于数组名与指针的讨论.pdf

    C语言学习趣事20关于数组名与指针的讨论.pdf

    字符数组与字符指针

    4. **数组名与指针:** - **数组名:** 数组名本质上是指向数组第一个元素的常量指针,不能被重新赋值。 - **指针:** 指针可以被重新赋值,指向不同的地址。 5. **结构体中的应用:** - **字符数组:** 在...

    数组名 != 指针

    - **指针与数组名的转换**:在某些上下文中,数组名会自动转换为指向数组首元素的指针,但这并不意味着数组名本身是可修改的指针。 #### 结论 通过对上述概念和例子的分析,我们可以得出结论:虽然数组名在很多...

    彻底理解指针,指针数组和数组指针,指针函数和函数指针

    2. **数组指针**:可以用来处理二维或更高维度的数组,简化数组操作。 3. **函数指针**:在实现回调函数、策略模式等设计模式时非常有用。 4. **指针函数**:通常用于返回动态分配的数组或其他复杂数据结构。 通过...

    数组与指针的艺术 pdf

    #### 四、指针与数组的混淆 文档中提到的一些常见的错误观点包括: - “一维数组是一级指针”、“二维数组是二级指针”等说法。这些说法忽略了数组名和指针之间的本质区别。 - “数组名是一个常量指针”、“数组名...

    C++习题 6数组与指针

    - **数组名与指针常量**:数组名在表达式中自动转换为指向数组第一个元素的指针常量。 - **不可改变的地址**:数组名中存放的地址是不可改变的,所以数组名称为指针常量。 - **丢失的数组信息**:使用数组名作为指针...

    数组与指针的艺术.doc

    数组与指针紧密相连,数组名通常表示数组的起始地址,因此可以用于传递数组的位置信息。然而,数组名不是一个可以赋值或修改的变量,而是一个常量表达式。这一特性使得数组名在某些场合下可以与指针等价使用,但两者...

    数组与指针概念剖析

    ### 数组与指针概念剖析 #### 前言 本文是基于2005年发表的《再再论指针》的修订...在后续章节中,我们将进一步探讨指针与数组的高级用法,包括指针算术、动态内存分配等主题,以帮助读者更全面地掌握这一核心技能。

    探讨C++中数组名与指针的用法比较分析

    指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。但是数组名有些地方又不同于指针。这里将数组名与指针用法的不同做一下总结(有些资料来自互联网),不妥之处,还望指正...

    数组指针和指针数组的区别

    数组指针和指针数组的区别

Global site tag (gtag.js) - Google Analytics