char* 和 cha[]
char* s1 = "hello";//字符串常量
s是一个保存了字符串首地址的指针变量,同时也是字符串的名字,s的内容是第一个字符的地址,当s指向常量字符串时候,内容不能改变(s[1]='y';错的!因为s[1]就是第二个常量字符的地址,这个地址是唯一的,不能改变!),但是整体可以修改(s = "addd"就可以)。
cout << s1 ;// "hello"
cout << *s1; //'h'
cout << s[]; // 'h'
cout << *(s1+); // 'e'
char 2s[] = "goodbye";//字符数组
char s2[]是有连续内存的数组,每个元素是char类型;s2指向的内存区域的地址和容量在生命期里不会改变,但数组里存的内容可以改变。
//s2操作同s1类似
s2 = s1;//错误!!!数组不能用等号赋值(除了初始化)
s1 = s2;//对
两者在内存里都在末位存了‘\0’
作为形参完全相同:
void function(char* s1);
void function(char s1[]);
为什么改变s1危险?
hello字符串是在编译时候就确定了,所以编译器知道它指的是常量,而且不希望你改变;但是数组只是个存储工具,编译时不知道它里面是什么,所以可以改。
int a=; //全局初始化区
char *p1; //全局未初始化区
main()
{
int b; //栈
char s[]="abc"; //栈
char *p2; //栈
char *p3=""; //123456\0在常量区,p3在栈上。
static int c=; //全局(静态)初始化区
p2 = (char*)malloc(); //分配得来得10和20字节的区域就在堆区。
strcpy(p1,""); //123456\0放在常量区,编译器可能会将它与p3所向"123456"优化成一个地方。
}
获取字符串长度
sizeof
当参数是数组名时,返回的时候数组内元素的个数,包括'\0';
当时其他变量时候,返回的是变量所占的字节数;
char *str1="absde";
char str2[]="absde"; int len1 = sizeof(str1);//4,因为str1是字符指针变量,占4个字节
int len2 = sizeof(str2);//6,str2是字符数组名,当sizeof参数是数组名时,返回数组长度(包括'\0')=6
所以求字符串常量的长度,使用strlen;求字符数组的长度,使用sizeof,strlen都可以。
strlen
参数必须是字符型指针,当数组名作为参数传入时,实际上数组就退化成指针了。
返回字符串的长度,而strlen不区分是数组还是指针,就读到\0为止返回长度。而且strlen是不把\0计入字符串的长度的。
char *str1="absde";
char str2[]="absde"; int len1 = strlen(str1);//5,strlen不包含'\0'
int len2 = strlen(str2);//5,strlen不包含'\0'
char* 和 cha[]的更多相关文章
- C语言 位运算
1G=1024M; 1M=102KB; 1KB=1024B(字节); 1B=8bits(位); #include<stdio.h> #include<stdlib.h> //C ...
- 字符串转成int数组
package lianxi; import java.awt.image.ConvolveOp; public class ZhengshuShuzu { public static void ma ...
- 正则表达式小结(Regular Expressions)
(原创文章,谢绝转载~) 日常开发中,常用正则表达式方便的进行匹配.筛选工作.正则的常用内容有: 一般情况下原则:从左至右,越多越好(贪婪) 字符:转义:\ ,如 \*,\d (数字)等 选择,cas ...
- Java数据结构和算法(四)——栈
前面我们讲解了数组,数组更多的是用来进行数据的存储,纯粹用来存储数据的数据结构,我们期望的是插入.删除和查找性能都比较好.对于无序数组,插入快,但是删除和查找都很慢,为了解决这些问题,后面我们会讲解比 ...
- 大数字加法(hduoj)
Problem Description I have a very simple problem for you. Given two integers A and B, your job is to ...
- Java的实验程序之输出单个文件中的前 N 个最常出现的英语单词
日期:2018.10.11 星期四 博客期:016 题目:输出单个文件中的前 N 个最常出现的英语单词,并输出到文本文件中 在程序运行之前,我试着先写了字符的字母的总结,加载代码如下: //如下是第一 ...
- Java数据结构和算法(四):栈
一.简介 栈(英语:stack)又称为堆栈或堆叠,栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表.它按照先进后出的原则存储数据,先进入的数据被压入栈底(Bottom),最后的数据在 ...
- HDU 3720 Arranging Your Team
先分组,然后暴力:注意 初始化时不要为0 会有负数:我直接二进制枚举: dfs是正解:呵呵 #include <iostream> #include <cstdio> #in ...
- web 页面 验证码 实现
1. 前台页面代码: 页面刷新时会自动请求 ${pageContext.request.contextPath}/yanzheng?yz=&time=-1111 这个action <f ...
随机推荐
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_10 打印流_1_打印流_概述和使用
system.out就是打印流 System的源码里面out参数就是一个PrintStream类型的 例如路径写的是E盘,.没有e盘这个路径就会抛出异常 用println直接写入的就是97 这个 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第3节 Random类_8-Random概述和基本使用
用来产生随即数字 构造方法有一个是为空的 每次运行数值都不一样
- 阶段1 语言基础+高级_1-3-Java语言高级_03-常用API第二部分_第2节 Date类_5_练习_计算出一个人已经出生了多少天
Alt+回车
- 红米note2 刷机 注意问题:
其他的百度都有,用刷线宝刷 红米note2 刷机 注意问题: 关机状态线下,链接电脑,按着音量下键不松手,按电源键开机后松开,即进入刷机模式. 其中,红米,红米1s移动,红米note移动3g/联通 ...
- 【GTS】关于GtsTetheringTestCases模块的几个失败项
GTS---关于GtsTetheringTestCases模块的几个失败项 1.run gts -m GtsTetheringTestCases -t com.google.android.tethe ...
- Java io基础
1.什么是IO? Java IO即Java 输入输出系统.不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这要考虑的因素特别多,比如我们要考虑和哪种媒 ...
- JQ判断div是否隐藏
1. $("#tanchuBg").css("display") 2. $("#tanchuBg").is(":visible ...
- ubuntu 上用virtualenv安装python不同版本的开发环境。
1.用pip安装virtualenv apt-get install python-virtualenv 2.创建python2的虚拟环境,进入要创建虚拟环境的目录下,我是放在/home/pyenv/ ...
- 洛谷 P1108 低价购买(LIS,统计方案数)
传送门 解题思路 看第一个要求,很显然是求最长下降子序列,和LIS几乎一样,很简单,再看第二个问号,求最长下降子序列的方案数??这怎么求? 注意:当二种方案“看起来一样”时(就是说它们构成的价格队列一 ...
- P5444 [APIO2019]奇怪装置
传送门 考虑求出最小的循环节 $G$ 使得 $t,t+G$ 得到的数对是一样的 由 $y \equiv t \mod B$ ,得到 $G$ 一定是 $B$ 的倍数,设 $zB=G$,则 $t,t+zB ...