2019独角兽企业重金招聘Python工程师标准>>>

在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;
}

运行结果为:

40 4

4

转:http://www.cnblogs.com/dolphin0520/archive/2011/04/03/2004808.html

转载于:https://my.oschina.net/lvguidong/blog/686033

char *a 和char a[] 的区别(指针和数组的区别)相关推荐

  1. 指针数组、数组指针、数组的区别与联系

    指针数组.数组指针.数组的区别与联系! 一:基本定义 1.指针数组 char *arr[4] = {"hello", "world", "shannx ...

  2. C++指针和数组的区别(不能混用的情况)

    通常情况下,C++中指针和数组是可以混用的,但是,在编写字符数组的全排列的时候,混用却出了问题,因此,今天特地mark一下,以备日后查找 这里整理的,不包括用new开辟的动态数组 1.数组一旦声明,我 ...

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

    看<C专家编程>一书,看到数组与指针并不相同一章,遂做了一段测试: 代码: #include <stdio.h> #include <stdlib.h>int ma ...

  4. C语言中指针与数组的区别,C语言 指针与数组的详解及区别

    C语言 指针与数组的详解及对比 通俗理解数组指针和指针数组 数组指针: eg:int( *arr)[10]; 数组指针通俗理解就是这个数组作为指针,指向某一个变量. 指针数组: eg:int*arr[ ...

  5. 指针—— char p[] 和 char *p

    目录 1. char p[]和char *p   ☆☆☆☆ 2. 3.  函数里的指针** 4.数组作为函数参数传递 5. 两数交换的那些坑 6. 函数参数为指针应小心 7. 数组指针 ** 8. 二 ...

  6. 指针和数组替换和区别

    指针和数组替换和区别 指针和数组在很多方面都可以替换 为什么不直接用while(*str++ != '\0')涉及到了Lvalue和Rvalue的问题  // http://www.dotcpp.co ...

  7. 浅谈C中的指针和数组(一)

    本文转载地址:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242138.html 在原文的基础上加入自己的想法作为修改. 指针是C/C ...

  8. 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  9. 什么是指针?什么是数组?指针和数组的关系?

    什么是指针?什么是数组?指针和数组的关系? 形象地讲,我们可以把计算机的内存看作一条长街上的一排房屋,每个房间都可以容纳数据并通过一个房号来表识.而表示每个房间房号的值我们可以称为地址.或许这样的比喻 ...

最新文章

  1. 加密软件究竟有哪些作用呢?
  2. 从Linux上查看接口路由IP(吓一跳ip)
  3. pycharm设置开发模板
  4. [C++]动态规划系列之币值最大化
  5. 2017_9_20 生活记录
  6. java常用省份合集
  7. Linux下使用FDDB 测试MTCNN人脸检测模型生成 ROC 曲线
  8. AlphaGo已然独孤求败,通过人工智能解放鉴黄劳动力还会有多久?
  9. webpack5从零搭建一个项目
  10. 常用的人脸检测识别等数据集百度云下载
  11. 是面试官放水,还是实在公司太缺人?这都没挂,阿里巴巴原来这么容易进...
  12. 2023年还在问前端怎么学?一份前端学习指南
  13. 定制NFC卡片/ntag213芯片卡/手机NFC感应卡片
  14. 乌班图18下安装QQ
  15. 【xdoj难题集】1039: 饭桌上的游戏
  16. Bitdefender 发布GandCrab V5.2勒索病毒解密工具 (免费)
  17. 【codeforce 141D】Take-off Ramps 最短路问题
  18. “新工科”爆红!留学选专业这些专业一定要看
  19. Golang中Int32转换为int16丢失精度的具体过程
  20. 测试需要掌握的数据库sql知识(一):基本语句操作

热门文章

  1. java aes php_php和java的aes默认加密算法有点区别及解决方法。
  2. mysql update时数据不存在新增_mysql sql语句新增判断,存在修改,不存在新增
  3. java c++的区别_Java语言与C、C++之间的区别?
  4. requirednew基于xml配置日志不回滚_Elasticsearch配置IK分词器的远程词库
  5. elementui datetimepicker 移动端_在 Gitee 收获 2.5K Star,前后端分离的 RuoYi 它来了
  6. nginx+lua实现上传文件到OSS
  7. Angular应用中tsconfig.json文件配置说明及配置全局路径映射
  8. 数据结构学习系列文章合集
  9. python绝对值编程_Python-abs vs fabs
  10. h5大转盘抽奖源码后台_微信H5互动营销应该要如何做?