推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

数组与指针有哪些区别?

   2023-08-01 网络整理佚名930
核心提示:数组名的指向不可以改变,而指向数组的指针是可以改变的。因为数组名的指向是不可以改变的,使用自增运算符自增就会改变其指向,这是不对的,数组名只能指向数组的开头。字符串指针指向的字符串中的字符是不能改变的,而字符数组中的字符是可以改变的。求数组长度时,借用数组名可求得数组长度,而借用指针却得不到数组长度。(p)求得的是p这个指针变量本身所占用的字节数,而不是整个数组占用的字节数。

点击上方“嵌入式大杂烩”,选择“热门公众号”,第一时间查看编程笔记!

前言

数组指针并不等同,例如:

区别一

指向数组名称的指针不能更改,但指向数组的指针可以更改。

请看下面的代码:

#include 

int main(void)
{
int a[5] = {0, 1, 2, 3, 4}, *p = a;
char i;

// 数组遍历方式一
for ( i = 0; i < 5; i++ )
{
printf("a[%d] = %d\n", i, *p++);
}

// 数组遍历方式二
for ( i = 0; i < 5; i++ )
{
printf("a[%d] = %d\n", i, *a++);
}

return 0;
}

数组遍历方法一:使用指针遍历数组元素,p++相当于(p++),即每次将指针指向的地址向后移动一个单位,然后取地址上的值。 这里的单位是(int)字节。

数组遍历方法二:使用数组名自增遍历数组元素,出现编译错误。 错误如下:

error: value required as increment operand

因为数组名的指向是不能改变的,使用自增运算符自增会改变它的指向,这是错误的,而且数组名只能指向数组的开头。 但可以改成下面的遍历方法:

for ( i = 0; i < 5; i++ )
{
printf("a[%d] = %d\n", i, *(a+i));
}

这可以正确地迭代数组元素。 因为*(a+i)相当于a[i]。

区别二

字符串指针所指向的字符串中的字符不能改变,但字符数组中的字符可以改变。

请看下面的代码:

//字符串定义方式一
char str[] = "happy";

//字符串定义方式二
char *str = "happy";

字符串定义方法1:字符串中的字符是可以改变的。 例如,您可以使用 str[3]='q' 之类的语句来更改其中的字符。 原因是:这样定义的字符串存储在全局数据区或堆栈区,是可读可写的。

字符串定义方法2:字符串中的字符不能改变。 原因是:这样定义的字符串存放在常量区,不能修改。

区别三

在计算数组长度时,借用数组名可以得到数组的长度,但借用指针却无法得到数组的长度。

请看下面的代码:

#include 

int main(void)
{
int a[] = {0, 1, 2, 3, 4}, *p = a;
char len = 0;

// 求数组长度方式一
printf("方式一:len=%d\n",sizeof(a)/sizeof(int));

// 求数组长度方式二
printf("方式二:len=%d\n",sizeof(p)/sizeof(int));

return 0;
}

运算结果

方式一:len=5
方式二:len=1

求数组长度的方法一:利用数组名求数组长度,数组有5个元素,正确。

求数组长度的第二种方法:用指针求数组的长度,得到的长度是1,这是一个错误。 因为:

p只是一个指向int类型的指针,编译器不知道它是指向整数还是数组。 (p) 得到的是指针变量p本身所占用的字节数,而不是整个数组所占用的字节数。

以上是指针和它所指向的数组的三个典型区别:(1)遍历数组时需要注意; (2)修改字符串中的字符时需要注意; (3)计算数组长度时需要注意。

结束:如果这些网站对您有帮助,请收藏、转发、观看哦~

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON