char[]数组与char *指针的区别

问题描述

虽然很久之前有看过关于char指针和char数组的区别,但是当时没有系统的整理,到现在频繁遇到,在string,char[], char *中迷失了。由于string涉及的内容很多,因此本文中就先不整理了,对char[]和
char *进行了一个整理,原理可能还是不太明白,但至少印象深刻了很多。

整型数组和整型指针

在讨论字符数组、字符指针以及字符串之前,先看下整型数组与整型指针的区别

    int a[]={1,2,3};//整型数组,a的指向不能改变,但数组的内容可以改变int *p = a;//整型指针,可以改变指向//resetiosflags(ios::right)<<setw(12)用来设置右对齐的格式cout<<"a = "<<resetiosflags(ios::right)<<setw(12)<<a<<endl;//输出结果为a在内存中的位置cout<<"&a = "<<resetiosflags(ios::right)<<setw(11)<<&a<<endl;//对数组名取地址,结果同上cout<<"p = "<<resetiosflags(ios::right)<<setw(12)<<p<<endl;//输出结果与a一致cout<<"&p = "<<resetiosflags(ios::right)<<setw(11)<<&p<<endl;cout<<"&a[0] = "<<resetiosflags(ios::right)<<setw(7)<<&a[0]<<endl;//数组第一个元素的地址


从结果可以看出,整型数组名和对数组名用取地址"&"运算符得到的结果是一致的,其结果与数组的首个元素在内容在的地址相同;但对于整型指针,两者的值有所不同

    cout<<"*a = "<<*a<<endl;cout<<"*p = "<<*p<<endl;cout<<"&(*a) = "<<&(*a)<<endl;cout<<"&(*p) = "<<&(*p)<<endl;cout<<"*(&a) = "<<*(&a)<<endl;cout<<"*(&p) = "<<*(&p)<<endl;

此处* a代表的是a指向的数组的第一个元素的值,* p 与* a 相同
对* a和* p取地址得到的实际上就是数组的地址
&a和&p已经是地址了,
加上* 得到的结果对于数组名而言,是数组的地址,对指针p而言,是其指向的内容的地址

void f1(int arr[])//与 f1(int *arr)在本质上一致
{cout<<"In f1 sizeof(arr) is: "<<sizeof(arr)<<endl;//这个时候,虽然传入的是数组,但是arr自动退化为指针
}cout<<"In main sizeof(a) is: "<<sizeof(a)<<endl;//输出12,即整个数组的大小cout<<"In main sizeof(p) is: "<<sizeof(p)<<endl;//输出4,即整型指针的大小f1(a);if (a== p)//用==对a和p进行比较时,两者是相同的{cout<<"a == p "<<endl;}elsecout<<"a != p "<<endl;

对数组名和指针名用sizeof的结果如下

总的来说,在整型数组中,数组名相当于指向数组首元素的指针,但其指向不可改变。当将一个数组作为参数传递给函数时,实际传入的是指针。

字符数组和字符指针

首先定义两个字符数组和两个字符指针

    char ch1[] = "hello world";//字符数组char ch2[] = "hello world";char * ch3 = "hello world";//字符指针char * ch4 = "hello world";

然后对数组以及指针进行一系列的输出

  1. 输出字符数组的名和指针名

    //这四个语句的输入是相同的cout<<"ch1 = "<<ch1<<endl;//输出的是整个字符数组的内容cout<<"ch2 = "<<ch2<<endl;//同上cout<<"ch3 = "<<ch3<<endl;//输出的指针指向的整个区域的值cout<<"ch4 = "<<ch4<<endl;

输出字符数组的名和指针名的结果如下图所示

从输出结果可以看到与整型数组和整型指针的输出结果完全不同,在整型数组和整型指针的情况下,输出的是内存中的地址,字符串数组名输出的结果是整个字符串数组的内容,字符串指针输出的内容是所指向的字符串的所有内容。

  1. 对数组和指针名取地址

   cout<<"&ch1 = "<<&ch1<<endl;//每个指针各自在内存中的地址cout<<"&ch2 = "<<&ch2<<endl;cout<<"&ch3 = "<<&ch3<<endl;cout<<"&ch4 = "<<&ch4<<endl;

对字符数组和字符指针取地址后的输入结果如下图

从结果可以看出,输出的是每个指针各自的地址(数组名实质上就是指向数组首地址的指针)

  1. 对首元素去地址

   cout<<"&ch1[0] = "<<&ch1[0]<<endl;//输出的结果是整个字符串数组cout<<"&ch2[0] = "<<&ch2[0]<<endl;//同上cout<<"&ch3[0] = "<<&ch3[0]<<endl;//同上cout<<"&ch4[0] = "<<&ch4[0]<<endl;//同上

在整型数组中,&a[0]的输出结果是数组的首地址,在字符串中,结果却不是

由结果可知,字符数组的第一个元素取地址的结果输出的却是整个字符串

  1. 对数组名和指针用* ,同时对首元素取地址后用*

   cout<<"*ch1 = "<<*ch1<<endl;cout<<"*ch2 = "<<*ch2<<endl;cout<<"*ch3 = "<<*ch3<<endl;cout<<"*ch4 = "<<*ch4<<endl;cout<<"*(&ch1[0]) = "<<*(&ch1[0])<<endl;cout<<"*(&ch2[0]) = "<<*(&ch2[0])<<endl;cout<<"*(&ch3[0]) = "<<*(&ch3[0])<<endl;cout<<"*(&ch4[0]) = "<<*(&ch4[0])<<endl;


结果比较好理解,就是字符数组的第一个字符

  1. &和* 同时使用

   cout<<"&(*ch1) = "<<&(*ch1)<<endl;cout<<"&(*ch2) = "<<&(*ch2)<<endl;cout<<"&(*ch3) = "<<&(*ch3)<<endl;cout<<"&(*ch4) = "<<&(*ch4)<<endl;cout<<"*(&ch1) = "<<*(&ch1) <<endl;cout<<"*(&ch2) = "<<*(&ch2) <<endl;cout<<"*(&ch3) = "<<*(&ch3) <<endl;cout<<"*(&ch4) = "<<*(&ch4) <<endl;


输出的结果是整个字符数组,和整型的情况又不同

  1. 用==和strcmp比较

   if (ch1== ch2)cout<<"ch1== ch2"<<endl;elsecout<<"ch1 != ch2"<<endl;if (ch3== ch4)cout<<"ch3== ch4"<<endl;elsecout<<"ch3 != ch4"<<endl;if (strcmp(ch1,ch2) == 0 )cout<<"Using strcmp, ch1 = ch2"<<endl;elsecout<<"ch3 != ch4"<<endl;


由于ch1和ch2s是两个不同的数组,所以用== 判断的返回结果为假
ch3和ch4是两个指针,其指向内容相同,因此用== 判断返回值为真
strcmp比较的只是数组的内容,ch1与ch2的内容是相同的

转载于:https://www.cnblogs.com/scut-linmaojiang/p/4742617.html

char[]数组与char *指针的区别相关推荐

  1. 神奇的判断数组名和指针的区别

    神奇的判断数组名和指针的区别 代码 代码 傻傻的区分不清楚数组名和指针的区别,下面的代码可以证明指针和数组名其实不是一个东西: // An highlighted block #include< ...

  2. 从编译器角度分析C语言中数组名和指针的区别

    从编译器角度分析C语言中数组名和指针的区别 数组名和指针是两个往往很容易让人们混淆的概念,很多人以为数组名就是一个指针,也有很多人知道数组名不同于指针但是仅知道数组名的值不能像指针一样改变. 例如你可 ...

  3. char数组与char指针

    转载来源: https://www.cnblogs.com/nzbbody/p/3553222.html https://blog.csdn.net/jack_20/article/details/7 ...

  4. c语言char数组的对比,char数组 、char指针与字符串常量的比较

    数组不是基本类型,不能直接参与比较,数组与字符串及字符指针与字符串比较其实比较的是二者的地址. 例: int isequiv(char *t) { if (t == "char") ...

  5. 字符串数组 和 字符串指针 的区别

    在C语言中,对字符串的操作主要有两种方式,一是使用字符数组,char str[]:二是使用字符指针.那么二者有什么区别呢?下面将分述二者的使用,最后进行比较. 一.字符数组 使用char str[]定 ...

  6. 字符串数组和字符串指针的区别

    基本知识:数组要么在静态存储区被创建(如全局数组),要么在栈上被创建.数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变.而指针是动态变换的,它指向的指针可以随 ...

  7. C语言—字符串与字符数组,字符串数组与字符串指针的区别

    字符串与字符数组 字符串一定是一个char的数组,但char的数组未必是字符串.--以字符'\0'结尾的char数组就是一个字符串,但如果char数组没有以'\0'结尾,那么就不是一个字符串,只是普通 ...

  8. 字符数组与字符指针的区别

    1.字符指针可以指向一个字符串. 我们可以用字符串常量对字符指针进行初始化.例如,有说明语句: char *str = "This is a string."; 是对字符指针进行初 ...

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

    1: 指针是一个变量,而数组名不是.数组名是数组的首地址,即它本身就是一个地址. 2:假设a是一个数组名,而p是一个指针,当你使用 a 和 &a 时,得到值是一样的,都是数组的起始地址.而使用 ...

最新文章

  1. 关于python创建类的深入理解
  2. 美国防部用AI消除“战争迷雾”,机器人、无人机全上阵
  3. rtmp 时间戳问题
  4. Github 新学入门
  5. MCollective架构篇1-MCollective架构的引入
  6. [转载]Qt之鼠标样式
  7. oracle数据库索引介绍,SQL Server和Oracle数据库索引介绍
  8. windows rt运行android,Move from Android to WinRT
  9. MacBook 重装 Apache 和 PHP 7.2
  10. 二阶声波正演c语言程序_问:程序员怎么敲代码才不累?答:装上显示器支架之后...
  11. 笔记《深入浅出数据分析》上
  12. ECHARTS的基本使用:柱状图、折线图、饼图等
  13. 基于移动终端的汉语手语识别技术研究
  14. android animator
  15. 【智能制造】生产异常情况的处理流程
  16. win7系统提示actionscript错误如何解决
  17. 掌财社寒山:快乐水不行了 快乐酒就能救可口可乐吗?
  18. python argparse命令行参数解析
  19. 体育战略放眼全球 今目标携海信手机开启欧洲杯JINGOAL季
  20. 阿里云免费证书DV SSL申请过程记录

热门文章

  1. python元素定位id和name_Python+Selenium自动化软件测试实战:Xpath,class,id,name定位和Iframe框架跳转...
  2. 网站优化四大优势必须了解
  3. python统计字符串中每个单词出现的次数_python中每个单词出现的次数是一组字符串?...
  4. Deep Belief Network简介——本质上是在做逐层无监督学习,每次学习一层网络结构再逐步加深网络...
  5. 机器学习案例 特征组合——高帅富 冷启动——从微博等其他渠道搜集数据进行机器学习 用户年龄——线性分段处理...
  6. 深度学习实战篇-基于RNN的中文分词探索
  7. 启明星辰泰合发布新一代日志分析系统
  8. python3 aes 解密
  9. xadmin 更改后台一级目录名称
  10. 2018-2019 ACM-ICPC, Asia Xuzhou Regional Contest