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

1: 指针是一个变量,而数组名不是。数组名是数组的首地址,即它本身就是一个地址。
2:假设a是一个数组名,而p是一个指针,当你使用 a 和 &a 时,得到值是一样的,都是数组的起始地址。而使用 p 和 &p 时,得到的值是不一样的, p 表示指针 p 所指向的地址,而 &p 表示 p 这个变量的地址。再假设
p = a;
则 p 就表示数组a的起始地址,而&p是存储数组a的起始地址的那个地址。 这是因为编译器把a当成数组首地址,而&a当作数组第一个元素的地址,因此得到的值是一样的。
另外,sizeof(a)得到的是a所表示的数组的大小,而sizeof§得到的是指针的大小。

数组名和指针是两个往往很容易让人们混淆的概念,很多人以为数组名就是一个指针,也有很多人知道数组名不同于指针但是仅知道数组名的值不能像指针一样改变,例如你可以写出下面这样的代码:

int *p;
p++;
却不能写这样的代码:

int a[];
a++;
那么数组名跟指针之间到底有什么区别呢?
第一,在声明上,除了作为函数参数的数组名总是编译器转化成指针,其他情况下,数组名就是数组名,指针就是指针,二者不能混淆,你不能在一个文件中定义一个数组,而在另一个文件中把它声明成一个指针。

char a[]; //定义一个数组a

extern char *a; //在另一个文件中将a声明成一个指针
在编译器中,符号表用来存放C语言中有关标识符的属性信息,这些信息集中反应了标识符的特征属性。等到词法分析到代码声称

C语言数组指针指针数组是两种不同的概念。下面我将为您提供一些代码例子来说明它们之间的区别。 1. 指针数组示例: ```c #include <stdio.h> int main() { int a = 10, b = 20, c = 30; int *arr[3]; // 声明一个指针数组 arr[0] = &a; // 数组的第一个元素指向变量a arr[1] = &b; // 数组的第二个元素指向变量b arr[2] = &c; // 数组的第三个元素指向变量c for (int i = 0; i < 3; i++) { printf("arr[%d] = %d\n", i, *arr[i]); // 打印数组元素的值 } return 0; } ``` 输出结果: ``` arr[0] = 10 arr[1] = 20 arr[2] = 30 ``` 在上述代码,我们声明了一个指针数组`arr`,其的每个元素都是一个指向`int`类型的指针。然后,我们将变量`a`、`b`和`c`的地址分别赋给了数组的元素。最后,通过循环遍历数组,并使用解引用操作符`*`来获取数组元素所指向的值。 2. 数组指针示例: ```c #include <stdio.h> int main() { int arr[3] = {10, 20, 30}; int (*ptr)[3]; // 声明一个数组指针 ptr = &arr; // 数组指针指向数组arr的地址 for (int i = 0; i < 3; i++) { printf("(*ptr)[%d] = %d\n", i, (*ptr)[i]); // 通过数组指针访问数组元素的值 } return 0; } ``` 输出结果: ``` (*ptr)[0] = 10 (*ptr)[1] = 20 (*ptr)[2] = 30 ``` 在上述代码,我们声明了一个数组`arr`,并初始化了它的元素。然后,我们声明了一个数组指针`ptr`,并将数组`arr`的地址赋给了它。通过在指针前加上括号,我们可以使用解引用操作符`*`来访问数组元素的值。 总结来说,指针数组是一个数组,其的每个元素都是指针,而数组指针是一个指向数组指针。它们在使用方法和语义上有所区别
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值