c语言char数组的对比,char数组 、char指针与字符串常量的比较
数组不是基本类型,不能直接参与比较,数组与字符串及字符指针与字符串比较其实比较的是二者的地址。
例:
int isequiv(char *t)
{
if (t == "char")
return 1;
else
return 0;
}
int main()
{
char test[] = "char";
char *temp = "char";
printf("%d", isequiv(test));//输出 0
printf("%d", isequiv(temp));//输出 1
return 0;
}
那么为甚么test与temp同字符串“char”比较时结果会不一样呢?其实t=="char"比较的是地址!
首先,当你这么引用一个字符串的时候 "char",它表示存储在程序的常量区的一串字符串,它返回的就是这个常量区的字符串地址比如假设这个地址是 0x004038b0 "char",那么当你使用 char *temp = "char";的时候,temp就得到了这个常量字符串的地址,也就是temp等于 0x004038b0
或许你可以试试
char* p1 = "char";
char* p2 = "char";
char* p3 = "char";
char* p4 = "char";
这里的 p1 p2 p3 p4 的值都一样,都是指向常量区字符串 "char", 比如上面的 0x004038b0
然而当你这么只用的时候
char test[] = "char";
这里情况就和上面的不一样了,这样写的时候,编译器并不是让test也指向常量区的字符串"char",而是在本地堆栈分配了一段和"char"一样大的空间,如何把常量区字符串"char" 拷贝到test
可以这么理解
char* p1 = "char"; p1 和 常量区的"char"是同一个东西,地址相同
char test[] = "char"; test和 常量区的"char"不是同一个东西,但是内容相同
int isequiv(char *t)
{
if (t == "char")
return 1;
else
return 0;
}
以上面为例子
当你这么比较的时候 if (t == "char") 编译器是去比较t和"char"是不是同一个东西,它们的值(字符串的地址)是不是一样,而不是比较它们的内容是不是一样
由前面的讲解可以知道
char* p1 = "char"; p1 和"char"的值是一样的
char test[] = "char"; test 和 "char"的值不一样,只是它们指向的字符串内容一样而已
要比较两个字符串的内容是不是一样,用 strcmp()返回0就是一样
比如,你那个函数可以改为
int isequiv(char *t)
{
if (strcmp(t, "char") == 0)
return 1;
else
return 0;
}
ps:你要理解两个感念,
同一个东西
内容相同的两个东西
注:字符串比较用用strcmp()函数,strcmp(test,"char")及strcmp(temp,"char")!
c语言char数组的对比,char数组 、char指针与字符串常量的比较相关推荐
- 指针指向字符串常量和给字符数组赋值字符串常量的本质
众所周知任何类型的指针在32位模式下大小都为4BYTE,很多人对数组和指针并不能很好的区分它们的区别,首先在C语言层面,数组名是一个常量不可修改,而指针可以随意指向,其次如果在a.cpp中定义了 ch ...
- 【错误记录】C 语言中通过指针操作字符串常量出错记录 ( 只有 栈内存 或 堆内存 中的数据才能通过指针修改 | 不要通过指针修改常量区的字符串 )
文章目录 一.报错记录 二.修改方案 一.报错记录 执行下面的代码 , 报错如下 : 执行的错误代码 : #include <stdio.h> #include <stdlib.h& ...
- c++ map中用char数组_C开发实战-指针和字符串
指针操作字符数组 首先定义一个字符数组char_array,该数组占据11个字节,因为初始化值是字符串常量,而字符串常量以0结尾 char char_array[] = "helloworl ...
- C语言学习笔记09-数组、字符数组、字符串数组、二维数组(单字符输入输出putchar、getchar,字符串输入输出的scanf、gets、puts)
C语言数组 数组作用:可以用来保存很多记录(可以看成一种大容器).一些简单游戏也基本由数组实现,如游戏地图(二维数组)等等. 一个数组 划分 多个单元(下标区分) -存放-> 多个同类元 ...
- 【C 语言】字符串 一级指针 内存模型 ( 指定大小字符数组 | 未指定大小字符数组 | 指向常量字符串的指针 | 指向堆内存的指针 )
文章目录 一.字符串 一级指针 内存模型 1.指定大小字符数组 2.未指定大小字符数组 3.指向常量字符串的指针 4.指向堆内存的指针 一.字符串 一级指针 内存模型 #include <std ...
- 《C和指针》——字符数组和字符串常量的区别
字符数组形式:char message1[ ]="Hello"; 尽管看上去像是一个字符串常量,实际上它并不量,它与char message[ ]={'H','e','l','l' ...
- C语言中可以用字符串常量来,C语言字符串详解
原标题:C语言字符串详解 字符串是一种非常重要的数据类型,但是C语言不存在显式的字符串类型,C语言中的字符串都以字符串常量的形式出现或存储在字符数组中.同时,C 语言提供了一系列库函数来对操作字符串, ...
- 【C 语言】字符串操作 ( 使用 数组下标 操作字符串 | 使用 char * 指针 操作字符串 )
文章目录 一.使用 数组下标 或 指针 操作字符串 1.使用 数组下标 操作字符串 2.使用 char * 指针 操作字符串 二.代码示例 一.使用 数组下标 或 指针 操作字符串 1.使用 数组下标 ...
- C语言,判断二维字符数组是否存在回文字符串 例如:char a[] [10]={“asd“,“asa“,“werew“,“yuyu“};
判断二维字符数组是否存在回文字符串 例如:char a[] [10]={"asd","asa","werew","yuyu&quo ...
最新文章
- 程序员必知的7种软件架构模式
- 关于深度学习的小知识点
- mysql编译参数查看_查看 apache,nginx,mysql 安装时的编译参数
- 计算机配置里面没有网络选项,主编教您win10网络设置中没有wlan选项怎么办
- java正则匹配的坑_java正则表达式入坑指南
- 创建完maven工程之后,提示[FATAL_ERROR] Cannot start Maven: Project JDK is not specified. a href=''Configure...
- Vcenter5.5+vmwarePowercli6.5+powershell5批量创建虚拟机
- IPv6报文格式讲解及其科学性探究
- [转]写一个块设备驱动(第七章)
- html的vue项目怎么兼容ie,Vue项目兼容IE/360方法
- 中建股份400亿大型IPO获“特批”
- 傅里叶、拉普拉斯、z变换常用公式合集
- 工业铝型材是怎样去生产的
- iPhone X 不充电维修案例
- Service Worker 学习笔记
- 【算法设计与分析】HDU-1108 C++诡异的楼梯(BFS迷宫最短路径)
- Python那些让我疑惑许久的代码
- Teamview免费版连接超限解决办法
- oracle获取当前时间
- SQL注入攻击讲解及PHP防止SQL注入攻击的几种方法
热门文章
- 装系统时总是提示 保存分区表时出现错误(0000000001)函数不正确
- Java基础:函数声明与调用
- 【MicroPython ESP32】通过sdcard模块读取SD卡实例
- 产品不够完美,品牌运营该如何策划
- hosts 文件不起作用的解决方法
- CodeForces700E Cool Slogans
- 开讲啦观后感2017计算机科学家,【开讲啦观后感2017】2017开讲啦观后感400字_2017开讲啦观后感500字_亲亲宝贝网...
- 包含联想、微软、三星在内的七家企业疑似侵犯滑动选择及触摸屏输入专利被提起美国337调查
- 谈谈产品和运营 - 什么是需求(中)
- 20151120 - 蓝牙鼠标与 WiFi 冲突的解决办法