数组和指针的区别深入剖析

 更新时间:2012年11月16日 15:43:19   作者:  
在C/C++中,指针和数组在很多地方可以互换使用,这使得我们产生一种错觉,感觉数组和指针两者是完全等价的,事实上数组和指针是有很大的区别的
在C/C++中,指针和数组在很多地方可以互换使用,这使得我们产生一种错觉,感觉数组和指针两者是完全等价的,事实上数组和指针是有很大的区别的。
1.两者在含义上的区别。
数组对应着一块内存区域,而指针是指向一块内存区域。其地址和容量在生命期里不会改变,只有数组的内容可以改变;而指针却不同,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错。
如:
复制代码 代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
  char*s1="123456789";
  char*s2="123456";
  strncpy(s1,s2,6);
  printf("%s %s\n",s1,s2);
  return0;
}

在编译时不会报错,但是在运行时会报错,原因在于企图改变s1的内容,由于s1,s2指向的是常量字符串,其内容是不可修改的,因此在运行时不会通过。而下面这个程序是可以运行通过的:
复制代码 代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
  char s1[10]="123456789";
   char s2[10]="123456";
   strncpy(s1,s2,6);
   printf("%s %s\n",s1,s2);
   return0;
}

在VC++ 6.0上可以编译运行通过,原因在于数组的内容是可以被修改的,这就充分体现了指针和数组的区别,并不是完全等价的。
2.计算内存容量的区别。
用运算符sizeof可以计算出数组的容量(字节数),而用sizeof却无法计算指针所指内存的容量,用sizeof(p)得到的结果永远是4或者2(即指针变量所占内存单元的字节数,一般情况下指针变量占2个或4个字节的内存单元)。在进行参数传递时,数组会自动退化为同类型的指针。
看下面这段代码和运行结果:
复制代码 代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void function(int a[])
{
printf("%d\n",sizeof(a));
}
int main(void)
{
int a[10]={1,2,3,4,5,6,7};
int*p=a;
printf("%d %d\n",sizeof(a),sizeof(p));
function(a);
return0;
}

相关文章

  • 零基础学习C/C++需要注意的地方

    零基础学习C/C++需要注意的地方

    这篇文章主要介绍了零基础学习C/C++需要注意的地方,文中讲解非常细致,供大家参考和学习,想要学习C/C++的可以阅读此文
    2020-06-06
  • C语言操作符超详细讲解上篇

    C语言操作符超详细讲解上篇

    C 语言提供了丰富的操作符,有:算术操作符,移位操作符,位操作符,赋值操作符,单目操作符,关系操作符,逻辑操作符,条件操作符等。因为篇幅过大将分两篇讲解,让我们通读本篇来详细了解吧
    2022-04-04
  • Qt实现UDP多线程数据处理及发送的简单实例

    Qt实现UDP多线程数据处理及发送的简单实例

    本文主要介绍了Qt实现UDP多线程数据处理及发送的简单实例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • C调用C++代码的方法步骤

    C调用C++代码的方法步骤

    本文主要介绍了C调用C++代码的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • 解析VScode在Windows环境下c_cpp_properties.json文件配置问题(推荐)

    解析VScode在Windows环境下c_cpp_properties.json文件配置问题(推荐)

    这篇文章主要介绍了解析VScode在Windows环境下c_cpp_properties.json文件配置问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 使用Qt实现监听网页是否响应并导出Excel表

    使用Qt实现监听网页是否响应并导出Excel表

    Qt导出数据到excel,方法有很多,下面这篇文章主要给大家介绍了关于使用Qt实现监听网页是否响应并导出Excel表的相关资料,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • 如何利用C语言输出3D立体感心形图详解

    如何利用C语言输出3D立体感心形图详解

    其实我们在程序中也有很多乐趣的,只是很多人不善于发现,这篇文章主要给大家介绍了关于C语言输出3D立体感心形图的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-12-12
  • 解决C++全局变量只能初始化不能赋值的问题

    解决C++全局变量只能初始化不能赋值的问题

    今天小编就为大家分享一篇解决C++全局变量只能初始化不能赋值的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Visual Studio安装的图文教程

    Visual Studio安装的图文教程

    这篇文章主要介绍了Visual Studio安装的图文教程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • C语言实现2048游戏代码

    C语言实现2048游戏代码

    这篇文章主要为大家详细介绍了C语言实现2048游戏代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05

最新评论