-
2013-02-27 16:56:32string[] Str1 = { "北", "京", "你", "好" };
string str = "";
for (int i = 0; i < Str1.Length - 1; i++)
{
str = str + Str1[i] + "|";
}
if (Str1.Length > 0)
{
str = str + Str1[Str1.Length - 1];
}
Console.WriteLine(str);更多相关内容 -
java怎么定义一个字符串数组,持续更新中
2021-06-29 14:53:4292、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 93、是否可以继承 String 类? 94、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的...专题1:JavaOOP
-
1、什么是B/S架构?什么是C/S架构
-
2、Java都有哪些开发平台?
-
3、什么是JDK?什么是JRE?
-
4、Java语言有哪些特点
-
5、面向对象和面向过程的区别
-
6、什么是数据结构?
-
7、Java的数据结构有哪些?
-
8、什么是OOP?
-
9、类与对象的关系?
-
10、Java中有几种数据类型
-
11、标识符的命名规则。
-
12、instanceof关键字的作用
-
13、什么是隐式转换,什么是显式转换
-
14、Char类型能不能转成int类型?能不能转化成string类型,能不能转成double类型
-
15、什么是拆装箱?
-
16、Java中的包装类都是哪些?
-
17、一个java类中包含哪些内容?
-
18、那针对浮点型数据运算出现的误差的问题,你怎么解决?
-
19、面向对象的特征有哪些方面?
-
20、访问修饰符 public,private,protected,以及不写(默认) 时的区别?
-
21、String 是最基本的数据类型吗?
-
22、float f=3.4;是否正确?
-
23、short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1; 有错吗?
-
24、重载和重写的区别
-
25、equals与==的区别
-
36、++i与i++的区别
-
37、程序的结构有哪些?
-
38、数组实例化有几种方式?
-
39、Java中各种数据默认值
-
40、Java常用包有哪些?
-
41、Object类常用方法有哪些?
-
42、java中有没有指针?
-
43、java中是值传递引用传递?
-
44、实例化数组后,能不能改变数组长度呢?
-
45、假设数组内有5个元素,如果对数组进行反序,该如何做?
-
46、形参与实参区别
-
47、构造方法能不能显式调用?
-
48、什么是方法重载?
-
49、构造方法能不能重写?能不能重载?
-
50、内部类与静态内部类的区别?
-
51、Static关键字有什么作用?
-
52、final在java中的作用,有哪些用法?
-
53、StringString StringBuffffer 和 StringBuilder 的区别是什么?
-
54、String str=”aaa”,与String str=new String(“aaa”)一样吗?
-
55、讲下java中的math类有那些常用方法?
-
56、String类的常用方法有哪些?
-
57、Java中的继承是单继承还是多继承
-
58、Super与this表示什么?
-
59、普通类与抽象类有什么区别?
-
60、什么是接口?为什么需要接口?
-
61、接口有什么特点?
-
62、抽象类和接口的区别?
-
63、Hashcode的作用
-
64、 Java的四种引用,强弱软虚
-
65、Java创建对象有几种方式?
-
66、有没有可能两个不相等的对象有相同的hashcode
-
67、拷贝和浅拷贝的区别是什么?
-
68、static都有哪些用法?
-
69、a=a+b与a+=b有什么区别吗?
-
70、final、finalize()、finally
-
71、JDBC操作的步骤
-
72、在使用jdbc的时候,如何防止出现sql注入的问题。
-
73、怎么在JDBC内调用一个存储过程
-
74、是否了解连接池,使用连接池有什么好处?
-
75、你所了解的数据源技术有那些?使用数据源有什么好处?
-
76、&和&&的区别
-
77、静态内部类如何定义
-
78、什么是成员内部类
-
79、Static Nested Class 和 Inner Class的不同
-
80、什么时候用assert
-
81、Java有没有goto
-
82、数组有没有length()这个方法? String有没有length()这个方法
-
83、用最有效率的方法算出2乘以8等於几
-
84、float型float f=3.4是否正确?
-
85、排序都有哪几种方法?请列举
-
86、静态变量和实例变量的区别?
-
87、说出一些常用的类,包,接口,请各举5个
-
88、a.hashCode() 有什么用?与 a.equals(b) 有什么关系?
-
89、Java 中的编译期常量是什么?使用它又什么风险?
-
90、在 Java 中,如何跳出当前的多重嵌套循环?
-
91、构造器(constructor)是否可被重写(override)?
-
92、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
-
93、是否可以继承 String 类?
-
94、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
-
95、String 和 StringBuilder、StringBuffer 的区别?
-
96、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
-
97、char 型变量中能不能存贮一个中文汉字,为什么?
-
98、抽象类(abstract class)和接口(interface)有什么异同 ?
-
99、静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?
-
100、Java 中会存在内存泄漏吗,请简单描述。
-
101、抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被 synchronized修饰?
-
102、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
-
103、如何实现对象克隆?
-
104、接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concreteclass)?
-
105、一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制?
-
106、Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?
-
107、内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?
-
108、Java 中的 final 关键字有哪些用法?
专题2:Java集合/泛型
-
1、ArrayList和linkedList的区别
-
2、 HashMap和HashTable的区别
-
3、Collection包结构,与Collections的区别
-
4、泛型常用特点 (待补充)
-
5、说说List,Set,Map三者的区别
-
6、Array与ArrayList有什么不一样?
-
7、Map有什么特点
-
8、集合类存放于 Java.util 包中, 主要有几 种接口
-
9、什么是list接口
-
10、说说ArrayList(数组)
-
11、Vector( 数组实现、 线程同步)
-
12、说说LinkList(链表)
-
13、什么Set集合
-
14、HashSet( Hash 表)
-
15、什么是TreeSet(二叉树)
-
16、说说LinkHashSet( HashSet+LinkedHashMap)
-
17、HashMap(数组+链表+红黑树)
-
18、说说ConcurrentHashMap
-
19、HashTable(线程安全)
-
20、TreeMap(可排序)
-
21、LinkHashMap(记录插入顺序)
-
22、泛型类
-
23、类型通配符?
-
24、类型擦除
专题3:Java中的IO与NIO
-
1、Java 中 IO 流?
-
2、Java IO与 NIO的区别
-
3、常用io类有那些
-
4、字节流与字符流的区别
-
5、阻塞 IO 模型
-
6、非阻塞 IO 模型
-
7、多路复用 IO 模型
-
8、信号驱动 IO 模型
-
9、异步 IO 模型
-
10、JAVA NIO
-
11、NIO 的缓冲区
-
12、NIO 的非阻塞
-
13、Channel
-
14、Buffer
-
15、Selector
专题4:Java反射
-
1、除了使用new创建对象之外,还可以用什么方法创建对象?
-
2、Java反射创建对象效率高还是通过new创建对象的效率高?
-
3、java反射的作用
-
4、哪里会用到反射机制?
-
5、反射的实现方式:
-
6、实现Java反射的类:
-
7、反射机制的优缺点:
-
8、Java 反射 API
-
9、反射使用步骤(获取 Class 对象、调用对象方法)
-
10、获取 Class 对象有几种方法
-
11、利用反射动态创建对象实例
面试题总结
其它面试题(springboot、mybatis、并发、java中高级面试总结等)
-
10、获取 Class 对象有几种方法
-
11、利用反射动态创建对象实例
[外链图片转存中…(img-fFyrxtzp-1624949608374)]
面试题总结
其它面试题(springboot、mybatis、并发、java中高级面试总结等)
[外链图片转存中…(img-Flg1KaVw-1624949608376)]
[外链图片转存中…(img-uW4l3Le5-1624949608377)]
-
-
java中定义字符串数组
2020-03-07 16:57:32各位大佬,java中怎么实现定义一个字符串数组,让每个索引对应一句话呀?(初学者(*^▽^*))3q~~ -
Matlab 之 字符串数组查找
2021-04-19 03:09:40字符串数组我通常会选择应用cell格式保存,下面的分析也是建立在这个前提下。【1】strcmp() 函数strcmp() 函数的基本功能是比较两个字符串是否相等,其基本用法是:TF = strcmp(s1,s2);但是,如果我们要查找字...Matlab的优势在于向量操作,字符串操作往往费时费力,但是如果能充分利用Matlab自带的一些函数,也可以取得不错的效果。下面就介绍一下字符串数组查找的小技巧。
字符串数组我通常会选择应用cell格式保存,下面的分析也是建立在这个前提下。
【1】 strcmp() 函数
strcmp() 函数的基本功能是比较两个字符串是否相等,其基本用法是:
TF = strcmp(s1,s2);
但是,如果我们要查找字符串数组中等于某字符串的索引时,该如果操作?strcmp() 函数也提供了这个功能,用法相同:
TF = strcmp(s1,s2);
其中,s1是字符串数组,s2是字符串,返回值为逻辑类型,大小与字符串数组s1相同;
【2】 strfind() 函数
strcmp() 函数比较的是两个字符串是否相等。但是如果想查找字符串数组中包含某字符串的记录时,我们就可以选择strfind() 函数。
k = strfind(str,pattern);
输出结果k表示pattern在str中出现的位置,若不出现,则返回[]。比如:
S = ‘Find the starting indices of the pattern string’;
k = strfind(S, ‘in’)
k =
上面是strfind() 函数的基本功能,但是如果查找字符串数组中包含某字符串的索引时,strfind() 函数也可以大显身手,返回和字符串数组相同大小的cell类型数据,每个cell为字符串出现位置,向量类型,比如:
cstr = {‘How much wood would a woodchuck’; ‘if a woodchuck could chuck wood?’};
idx = strfind(cstr, ‘wood’)
idx =
[* double]
[* double]
Idx{:,:}
ans =
ans =
【3】 一个问题:有一个字符串数组cstr1,要找到包含字符串str2的索引,该如果操作?
一个直接的答案是:
idx = strfind(cstr1,str2);
finger(length(idx),) = ==;
for i = :length(idx)
if ~isempty(idx(i))
finger(i) = ==;
end
end
思路是正确的,但是代码量有点大,需要7行,而且速度较慢。其实要实现这个功能,1行代码足矣。如下:
finger = ~cellfun(@isempty, strfind(cstr1,str2));
上面的代码还有另外一种写法,
finger = cellfun(@(x) ~isempty(strfind(x,str2)), cstr1);
三种方法输出结果是一样的,但是第2种方法速度最快,第1种方法次之,第3种方法最慢。大家可以进行测试下。
.net字符串数组查找方式效率比较
下面是代码: static void Main(string[] args) { string[] arr = new string[] { "AAA", "BBBB&q ...
matlab中的字符串数组与函数调用
1, matlab中的字符串就是1维字符数组,即如: a = 'dddssd'; b = 'lsde'; c = [a, b]; 当然也可以: c= strcat(a, b); 2, matlab中的 ...
014 Longest Common Prefix 查找字符串数组中最长的公共前缀字符串
编写一个函数来查找字符串数组中最长的公共前缀字符串. 详见:https://leetcode.com/problems/longest-common-prefix/description/ 实现语言: ...
Matlab之字符串处理
Matlab处理字符串 1.取得部分字符串 我们有一个字符串 file='20131030_113109.TemporaryAlias.Poly5'; 简单操作举例: >> a=file( ...
MATLAB 的字符串分析
MATLAB的字符串分析. 字符串实际上是指1Xn 的字符数组. MATLAB软件具有强大的字符串处理功能,提供了很多的字符或字符串处理函数,包括字符串的创建.字符串的属性.比较.查找以及字符串的转换 ...
Javascript-常用字符串数组操作
字符串的操作在编写Js的过程中是不可避免的 因为它太多的API 还有相似的API让我们很头痛 为了避免以后遇到模拟两可的问题 还是做个笔记比较好 把常用的字符串操作记录下来成笔记 方便以后查找 No1 ...
JavaScript内置对象(字符串,数组,日期的处理)
Date 日期对象 日期对象可以储存任意一个日期,并且可以精确到毫秒数(1/1000 秒). 定义一个时间对象 : var Udate=new Date(); 注意:使用关键字new,Date()的首 ...
随机推荐
svn中cleanup作用
我们开发项目的时候,用版本控制软件svn提交项目时候难免会遇到cleanup,那么这个提示是怎么产生的呢?它有什么作用呢? 产生原因:SVN 本地更新时,由于一些操作中断更新,如磁盘空间不够,用户取消 ...
JavaScript使用自定义事件实现简单的模块化开发
WEB前端最常见驱动方式就是事件了, 所有交互等等都是通过事件,前端的常见事件有: UI事件: 焦点事件: 鼠标事件: 滚轮事件: 文本事件: 键盘事件: 变动事件: 现在网页上有一个输入框, 如果我 ...
mongo .update
db.classes.update({"count":{$gt:20}},{$set:{"name":"c4"}},false,false) ...
PERL 脚本
PERL: Practical Extraction and Report Language 参考文档 1.Perl 5 version 24.0 documentation
调用webservice,解析返回数据为xml格式的字符串,进行数据绑定
DataSet ds = new DataSet(); byte[] byteArray = System.Text.Encoding.Unicode.GetBytes("<?xml ...
if form1.showmodal:=mrok then 什么意思
if form1.showmodal:=mrok then 这句话什么意思? 最佳答案 这个问题说来话长,且听我慢慢道来... 首先,你仔细看一看,所有的命令按钮(不论是Button还是BitBtn) ...
如何判断手机收有几张SIM卡
//判断卡槽1中是不是有卡 boolean hasIccCard1 = MSimTelephonyManager.getDefault().hasIccCard(0); //判断卡槽2中是不是有卡 b ...
C指针(转)
第一章 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有 ...
LeetCode 392. Is Subsequence
Given a string s and a string t, check if s is subsequence of t. You may assume that there is only l ...
【转】安卓Fragment不完全介绍
转两篇博客: 1.http://blog.csdn.net/lmj623565791/article/details/37970961 2.http://blog.csdn.net/lmj623565 ...
-
判断2个字符串是否含有相同的字符
2020-05-13 15:46:33还是只是记录下来相关位置——这是我底下未完成版本1想到的思路——用一个count[sizeof(A)]数组记录下A每个位置作为起点所能和B达到的最大重合,最后判断查找数组中最大值,此时目标子字符串的起点下标(i)和 i ... -
字符串数组与字符串指针
2016-01-04 19:01:43首先,先说一个非常基础的概念,字符数组的赋值操作。 给字符数组赋值分两种情况,单字符赋值和字符串赋值。 单字符赋值:可通过数组下标方式或指针方式,引用数组元素,进行赋值 //数组下标法最近在学指针,感觉内容繁多,概念不好掌握,除了上自己班的编程课,还去蹭了别人班的课,感觉很有收获,担心自己不及时总结就会忘了,也方便如后复习回顾和学习交流。
首先,先说一个非常基础的概念,字符数组的赋值操作。
给字符数组赋值分两种情况,单字符赋值和字符串赋值。
单字符赋值:可通过数组下标方式或指针方式,引用数组元素,进行赋值
字符串赋值:可使用string.h头文件中的字符串操作函数进行赋值,如:<span style="font-size:18px;"> //数组下标法 char a[5],ch='a'; int i; for(i=0;i<5;i++) a[i]=ch+i;//可通过数组下标引用数组元素,完成赋值 for(i=0;i<5;i++) printf("%d",a[i]);<span style="color:#009900;">//这里输出的数据类型如果说%c,那么输出的就是abcde,如果是%d则输出979899100101即对应的ASCII码值</span> return 0; //指针 char a[5],ch='a'; int i; char *p; for(p=a;p<a+5;p++) *p=ch++; </span>
<span style="font-size:18px;">char a[10]; strcpy( a, "abcdefgh"); sprintf(a, "%s", "abcdefgh");</span>
注意:数组在定义时,可以同时进行初始化,但定义完成后,就不能按初始化的形式对其赋值了,如:
char a[10]="abcdefgh"; //这样可以 a="abcdefgh"; //这样是错误的!a是数组名,是一个静态数据:数组首地址值,可以看作是个常数,不能再被改变。
即不能在赋值语句将一个字符串常量直接给一个字符数组赋值!
(以下引自http://www.tuicool.com/articles/nYfuAr)
怎么给这个数组赋值呢?
1、定义的时候直接用字符串赋值
char a[10]="hello";
注意:不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的!
2、对数组中字符逐个赋值
char a[10]={'h','e','l','l','o'};
3、利用strcpy
char a[10]; strcpy(a, "hello");
(以上)
(当然,也可以这样 char a[ ]="hello";)
下面一个很重要的话题就是关于字符串指针与字符数组的问题(http://blog.csdn.net/okliujieko/article/details/6821321 这个blog里说的比较详细可以看看,下面引用了其中最基础的概念)
用字符数组和字符指针变量都可实现字符串的存储和运算。但是两者是有区别的。在使用时应注意以下几个问题:
1. 字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。
2. 对字符串指针方式
char *ps="C Language";
可以写为:
char *ps;
ps="C Language";
而对数组方式:
static char st[]={"C Language"};
不能写为:
char st[20];
st={"C Language"};
而只能对字符数组的各元素逐个赋值。
从以上几点可以看出字符串指针变量与字符数组在使用时的区别,同时也可看出使用指针变量更加方便。
当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。
一个错误的例子,如下:
char *name;
scanf("%s",name);
printf("%s",name);
有的编译器虽然也能通过,但这是错误的,因为是个指针,定义时指向不可用的地址。解决这个问题有两种方法:用数组的方法或给字符针针分配内存空间的方法。
数组的方法:
char name[20];
scanf("%s",name);
printf("%s",name);
给字符针针分配内存空间的办法:
char *name;
name=(char*)malloc(50); //此时name已经指向一个刚刚分配的地址空间。
scanf("%s",name);
printf("%s",name);但是对指针变量直接赋值是可以的。因为C系统对指针变量赋值时要给以确定的地址。
3.int main()
{
char str1[40]="hello world!"; //char *str1="hello world!";
str1[4]='A'; //若str1是指针型的,编译通过,但运行是此处会段错误
printf("%s\n",str1);
return 0;
}
数组和指针都可以在它们的定义中用字符串常量进行初始化,尽管看上去一样,底层的实现机制却不相同。定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义的同时赋值给指针一个字符串常量进行初始化。例如:下面的定义创建了一个字符串常量(为其分配了内存):
char *p=”abcdefg”;
注意只有对字符串常量才是如此,不能指望为浮点数之类的常量分配空间,如:
Float *p=3.14; /*错误,无法通过编译*/
想要总结这方面的知识的原因是编程课的ppt上有这样一句代码
这里涉及到字符串作为地址的概念,因为定义了一个指针数组,数组元素都是指针,也就是地址<span style="font-size:18px;"> char * name[SIZE]=/*name是个指针数组*/ {“Ada”,“FORTRAN”,“Pascal”,“C”,“BASIC”,“FoxBASE”}; </span>
比如:<span style="font-size:18px;">//指针数组定义 char *book[4]={C Programming Language,Assembly Language,Java Language,Natural Language};</span>
book[0],book[1],book[2],book[3]分别是指向各个字符串的指针,即数组保存的是各个字符串的首地址。
下面解释了为什么可以将字符串常量复制给字符指针变量(摘自http://www.cnblogs.com/KingOfFreedom/archive/2012/12/07/2807223.html)
一、
C语言中,为什么字符串可以赋值给字符指针变量
char *p,a='5';
p=&a; //显然是正确的,
p="abcd"; //但为什么也可以这样赋值??
问:一直理解不了为什么可以将字串常量赋值给字符指针变量,请各位指点!双引号做了3件事:
1.申请了空间(在常量区),存放了字符串
2. 在字符串尾加上了'/0'
3.返回地址
你这里就是 返回的地址 赋值给了 p
二、
char *p = “hello”;
上边的表达式为什么可以,而把p换成数组,然后再赋值就不行了
解释:
字符串常量"hello"出现在一个表达式中时,"hello"表达式使用的值就是这些字符所存储的地址(在常量区),而不是这些字符本身。
所以,可以把字符串赋值给指向字符的指针p,而不能把字符串赋值给一个字符数组。
char a[10] = “hello”; //这样可以,这种情况是c语言初始化所支持的
如果写成char a[10]
然后 a = “hello” 这样就错误了。
同样是a数组,char a[10] = “hello”;这种是数组的初始化,和a[0] = ‘h’ a[1] = ‘e’…是一个道理
但是换成char a [10]
然后a = “hello”就不行了 “hello”赋值的值是一个地址,而a虽然也有地址,但是这与指针是不一样的,指针的值是地址,而数组的值虽然也是地址,但是却是一个常量,所以不能给常量赋值。
代码测试
#include <stdio.h>
int main()
{
char *p = "hello";
printf("%s",p);
char a[10];
a = "hello";
return 0;
}
error C2440: '=' : cannot convert from 'char [6]' to 'char [10]'
There is no context in which this conversion is possible
看到这样的错误提示,你是否会想到把char a[10]改成char a[6]呢
试一下,
error C2106: '=' : left operand must be l-value
运算符的左边应该是一个“左值”。所谓“左值”就是指在程序中占用内存空间、可以被修改的量,比如各种变量。
继续扩展问题:
在使用指针的时候,指针可以自增,而数组不能自增
编译器给数组分配了空间,数组a的地址就是一个常量了,让常量自增这肯定是不行的。
继续扩展:
在指针自增的时候,编译器会自动识别类型,比如指针是指向int型的,想获取下一个的地址时,指针直接p++就行了,不要多此一举的p+4了
特别需要注意的是,在void指针使用的时候,不能使用指针运算,应为void型编译器不能识别类型的长度(即指针所指对象的体积),p++这样就是不合法的,即不能进行数学运算,也不能使用*取值操作,想使用必须转换为其它的类型
三、
标题:对字符数组,字符指针,字符串常量1.以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写
"abc",那么编译器帮你存储的是"abc\0"2."abc"是常量吗?答案是有时是,有时不是。
不是常量的情况:"abc"作为字符数组初始值的时候就不是,如
char str[] = "abc";
因为定义的是一个字符数组,所以就相当于定义了一些空间来存放"abc",而又因为
字符数组就是把字符一个一个地存放的,所以编译器把这个语句解析为
char str[3] = {'a','b','c'};
又根据上面的总结1,所以char str[] = "abc";的最终结果是
char str[4] = {'a','b','c','\0'};
做一下扩展,如果char str[] = "abc";是在函数内部写的话,那么这里
的"abc\0"因为不是常量,所以应该被放在栈上。
是常量的情况: 把"abc"赋给一个字符指针变量时,如
char* ptr = "abc";
因为定义的是一个普通字符指针,并没有定义空间来存放"abc",所以编译器得帮我们
找地方来放"abc",显然,把这里的"abc"当成常量并把它放到程序的常量区是编译器
最合适的选择。所以尽管ptr的类型不是const char*,并且ptr[0] = 'x';也能编译
通过,但是执行ptr[0] = 'x';就会发生运行时异常,因为这个语句试图去修改程序
常量区中的东西。
记得哪本书中曾经说过char* ptr = "abc";这种写法原来在c++标准中是不允许的,
但是因为这种写法在c中实在是太多了,为了兼容c,不允许也得允许。虽然允许,
但是建议的写法应该是const char* ptr = "abc";这样如果后面写ptr[0] = 'x'的
话编译器就不会让它编译通过,也就避免了上面说的运行时异常。
又扩展一下,如果char* ptr = "abc";写在函数体内,那么虽然这里的"abc\0"被
放在常量区中,但是ptr本身只是一个普通的指针变量,所以ptr是被放在栈上的,
只不过是它所指向的东西被放在常量区罢了。3.数组的类型是由该数组所存放的东西的类型以及数组本身的大小决定的。
如char s1[3]和char s2[4],s1的类型就是char[3],s2的类型就是char[4],
也就是说尽管s1和s2都是字符数组,但两者的类型却是不同的。4.字符串常量的类型可以理解为相应字符常量数组的类型,
如"abcdef"的类型就可以看成是const char[7]5.sizeof是用来求类型的字节数的。如int a;那么无论sizeof(int)或者是sizeof(a)都
是等于4,因为sizeof(a)其实就是sizeof(type of a)6.对于函数参数列表中的以数组类型书写的形式参数,编译器把其解释为普通
的指针类型,如对于void func(char sa[100],int ia[20],char *p)
则sa的类型为char*,ia的类型为int*,p的类型为char*
7.根据上面的总结,来实战一下:
对于char str[] = "abcdef";就有sizeof(str) == 7,因为str的类型是char[7],
也有sizeof("abcdef") == 7,因为"abcdef"的类型是const char[7]。
对于char *ptr = "abcdef";就有sizeof(ptr) == 4,因为ptr的类型是char*。
对于char str2[10] = "abcdef";就有sizeof(str2) == 10,因为str2的类型是char[10]。
对于void func(char sa[100],int ia[20],char *p);
就有sizeof(sa) == sizeof(ia) == sizeof(p) == 4,
因为sa的类型是char*, ia的类型是int*,p的类型是char*。
四、
C语言中字符数组和字符串指针分析,该贴原址:http://www.cnblogs.com/gigikouyi/archive/2006/08/01/464737.html
这几天搞Unix上的C程序,里面用到了很多字符数组和字符串指针,我记得在学完C语言后相当一段时间里,对指针这个东西还是模模糊糊,后来工作也没怎么用到过C,虽然网上这类的文章也有很多,还是决定自己在这做个小总结,也算加深下自己的印象,写了下面的测试程序:
#include <stdio.h>int main(int argc, char *argv[])
{char day[15] = "abcdefghijklmn";
char* strTmp = "opqrstuvwxyz";printf("&day is %x\n",&day);
printf("&day[0] is %x\n",&day[0]);
printf("day is %x\n",day);
printf("\n&strTmp is %x\n",&strTmp);
printf("&strTmp[0] is %x\n",&strTmp[0]);
printf("strTmp is %x\n",strTmp);
getchar();
return 0;
}
运行后屏幕上得到如下结果:
其实看到结果估计很多东西就好明白了,先看看前三个输出也就是关于变量day的,在 char day[15] = "abcdefghijklmn"; 这个语句执行的时候,系统就分配了一段长15的内存,并把这段内存起名为day,里面的值为"abcdefghijklmn",如下图所示:
再看程序,第一个输出,&day,&号是地址运算符,也就是day这个变量的内存地址,很明显,在最前面,也就是a字符所在字节的地址;
对于第二个输出也就好理解了,&day[0],就是day数组中第一个变量(也就是a)的地址,因此他们两个是一样的;
第三个输出是day,对于数组变量,可以使用变量名来索引变量中的内容,其实这里的day可以理解成数组变量退化的指针,并且指向数组的开头,既然把它理解成指针,那么它的值肯定是地址了,所以他的值和上面两个也一样。
再看看后面三个输出,关于字符串指针strTmp,在执行char* strTmp = "opqrstuvwxyz";后,内存的图示如下:
如图所示,内存分配了两段内存,一个名为strTmp,类型是一个字符指针,另外一段是一个字符串常量,且strTmp里面存放着字符常量的首地址,注意这里无法通过strTmp修改这段字符串,因为是常量;于是程序中的后面三个输出就好理解了;
&strTmp:strTmp这个字符指针的地址
&strTmp[0]:strTmp所指字符常量第一个字符的地址
strTmp:strTmp这个字符指针的值,即字符常量的首地址
因此,最后两个的值是一样的。
指针可以这样理解,指针这种类型,和int,char,double等等是一样的,只是它用来保存地址值的,而int变量保存整数,char变量保存字符,仅此而已,就char型指针或者int指针,本质是一样的,都是存放的地址,只不过那个地址所里面的变量类型不同而已,还有一种void型指针,就是可以放任何类型变量的地址。五、个人代码以及注释,纯属个人理解,定有不妥之处,望批评指正:
#include <stdio.h>
int main(int argc, char *argv[])
{
char* strTmp = "abcd";
printf("strTmp is %s\n",strTmp);//将字符串常量"abcd"的地址所隐含的内容转换成“string类型”
printf("strTmp is %d\n",strTmp);//将字符串常量"abcd"的地址转换成int类型,这里不同的机子不同的时间的运行结果可能会不一样,因为地址可能会发生变化
printf("strTmp is %c\n",strTmp);//将字符串常量"abcd"的地址转换成字符型,这里不同的机子不同的时间的运行结果可能会不一样,因为地址可能会发生变化
printf("*strTmp is %c\n",*strTmp);//将字符串常量"abcd"的地址所隐含的内容转换成字符型,由下面注释的这句会抛出异常可知,这里并无截取字符串,*strTmp长度本身就是1
//printf("*strTmp is %s\n",*strTmp);//不能将字符转换成字符串型
getchar();
return 0;
}六、后来又有看到下面这样的说法可供读者参考:
1. C语言中没有字符串类型,只有用字符数组来表示。这和c++中string是有区别的,C++中string是可以直接赋值如string s;s="Hello world";但是C语言中的字符数组却不能这样。所以,这里的strTmp可以理解为字符数组的首地址,也可以用它代表整个字符数组,所以能输出所有字符数组中的内容。
2.字符串就是字符数组或者是指针。 内存实现都一样的。 数组名字就是一个指针。
char ch[100] ;
char *p;
p =ch;3.定义的字符串方式举例:
字符串定义其实很简单在c/c++语言中定义一个字符串可以使用如下的语法:
char *s1=“string1”;//定义字符串常量,指针形式
char s2[]=“string2”;//定义字符串常量,数组形式
char *s3=new char[10];//定义字符串变量并分配内存 指针形式
strcpy(s3,"string3");//为s3赋值
char s4[10];//定义字符串变量,数组形式
strcpy(s4,"string4");//为s4赋值
以上四种方法都能定义一个字符串,同时通过字符串在内存中的分布可以清楚地知道是什么情况
4. C语言中字符串赋值方法strcpy(char*d,char*s)其中s代表是源字符串,d代表目标字符串,也就是你要赋值的字符串。
5.c语言中的字符串跟java或c++中的字符串不同。如char *p;其中p是一个指针,p中存储一个内存缓冲区的首地址。所谓的内存缓冲区就是一段连续的内存地址,里面存放了一系列的字符。那系统又是如何判断在哪里结束呢。那就是根据符号‘\0’。这个字符占一个字节,8位,每位的值都是0。
总结一下,这篇blog讲了这几个方面的知识:
1.字符数组的赋值方法
2.字符串指针与字符数组的区别分析
3.解释了为什么可以将字符串常量复制给字符指针变量(也即字符串作为地址的问题)
啊啊啊总结这个花了好长时间呢,不过也值了,这个部分的概念本身就是容易混淆,现在总结了之后以后就可以随时回顾了,睡前再看一遍,哦对了,还有动态分配内存那一块要总结呢别忘了,快要期末考试了,复习线代去了……加油!!!
(如有疏漏,欢迎指正)
-
数组和字符串赋值的问题(定义时不初始化)
2021-12-25 21:26:55实际操作中,我们很多时候要输入数组元素的值,我们只能定义数组类型和大小...而往往课本上很多时候都是定义数组时就进行了初始化,某天下午我突然想理清一下两者的差别,中间犯了许多错误,有些感悟,便写成一篇随笔 -
python创建数组
2020-11-29 01:46:15广告关闭腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,... 一个5行3列的整数二维数组就创建了。 轻松写意... 创建一个python二位数组的尴尬也想模仿一下java,奈何只能:... -
字符数组调用(统计字符个数)
2021-11-15 23:19:27数组的单独使用并不常见,但数组可以使数据处理更加方便快捷,所以今天学习的字符数组调用就有一个简单的运用,输入一句话将输出有多少单词。 源码: #include<stdio.h> int main() { char string[81]; ... -
如何从Python中的列表中选择随机字符串?
2021-03-07 01:30:07我猜这可能不是您期望函数所做的:)您将所有的电影存储在一个字符串中,这可能是可以的,但我建议使用一个简单的数组(特别是如果您想以后再次使用数据,比如随机选择一个项目)。因此,不要将所有输入的电影名称串联... -
php索引数组转成关联数组
2021-03-26 14:58:06概念: 索引数组 ==== >>>$arr = []; 关联数组 ====>>> $arr = [ 'orange'=>1,'apple'=>'good' ]; 1.在tp5之前的tp3.2,我们知道索引数组转关联数组,是直接可以转成功的,因为php是弱语言类型.... -
数组、字符串和切片
2019-08-24 16:42:561.3 数组、字符串和切片 在主流的编程语言中数组及其相关的数据结构是使用得最为频繁的,只有在它(们)不能满足时才会考虑链表、hash表(hash表可以看作是数组和链表的混合体)和更复杂的自定义数据结构。 Go语言中... -
在JS内令字符串的每个单词首字母变为大写的方法
2018-12-27 11:28:19在申明字符串的时候,如果要将字符串的每个单词首字母都大写,长句子人工修改即为不变。举个栗子,将以下句子每个首字母大写: var str="frankly, my dear, I don't give a damn"; 首先,字符... -
详解PHP对数组的定义以及数组的创建方法
2020-12-18 10:22:33传统上把数组(array)定义为一组有某种共同特性的元素,这里的共同特性包括相似性(车模、棒球队、水果类型等)和类型(例如所有元素都是字符串或整数)等,每个元素由一个特殊的标识符来区分,这称为健(key)。... -
第七章_字符数组
2020-04-05 19:30:09文章目录第七章:字符数组@[toc]概述字符数组的定义字符数组的初始化声明时字符数组的初始化声明后字符数组的初始化字符串的初始化字符数组的引用字符数组和字符串的关系字符数组的输入和输出字符数组的输出不具有\0... -
String中空串与null的区别#抽取方法快捷键#字节数组转化成字符串#字符数组转化成字符串
2017-04-09 08:54:13String: String也是个类,且重写了toString方法,返回是该对象本身 String s1=""; String s2=null; System.out.println(s1); System.out.println(s2); ...* ""(空串)是一个String类的对象,...* null是一个空值,不能调 -
javaSE学习总结(9)java常用类
2020-04-21 00:26:04例如: 原数组:我爱你中国 逆序输出:国中你爱我 提示:先声明一个字符串数组,每个汉字作为字符串数组的一个元素,然后再从数组末尾开始循环输出。 【答案】 判断: 1.难度:较难 答案:错误 知识点:用运算符“==... -
字符串的顺序存储—C++实现
2021-04-02 14:59:51字符串的顺序存储—C++实现 ...将一个字符串中的所有元素拷贝到另一个字符串数组中 判断两个字符串是否相等 链接两个字符串 获取数组中第i个元素开始,长度为j的子串 在字符串第i个位置,插入一个子串,返回插入子串 -
C语言数组,一维二维数组,字符串,函数传参中的数组,清空输入缓冲区,冒泡&选择排序
2021-12-29 22:09:07C语言数组,一维二维数组创建及初始化,字符串输入与输出,字符串指针,函数中的数组传参,冒泡&选择排序,冒泡排序优化。 -
详解 Python 字符串(一):字符串基础
2021-01-16 20:59:45在 Python 中,字符串就是一串字符的组合,它是不可变的、有限字符序列,包括可见字符、不可见字符(如空格符等)和转义字符。Python 通过 str 类型提供大量方法来操作字符串,如字符串的替换、删除、截取、复制、... -
用一行Python代码实现按字符串内数字大小排列字符串顺序
2021-04-13 19:15:50本篇文章会用一行代码,让文本中出现的数字序号可以按照数字顺序进行排序。 -
数据结构之数组——每日一练
2022-04-14 21:50:35请问这句话的说法是正确的吗? 错误。 以下叙述正确的是?(B) A. 线性表的顺序存储结构优于链表存储结构。 B. 二维数组是其数据元素为线性表的线性表。 C. 栈的操作方式是先进先出。 D. 队列的操作方式是先进后出... -
C语言实现字符串逆序、倒置字符串(字符串逆序问题的升级)
2021-12-28 21:02:43利用c语言解决字符串逆序的问题、倒置字符串问题 -
C#字符串习题练习
2020-10-27 23:42:03C#字符串习题练习 前言: C#学的愈发迷惑,今天抽出一点时间来敲了敲一些基础的代码题,加深对字符串的印象。啊啊啊啊啊,不过写的真的好慢,以后还要提高效率。话不多说,切入正题。 1.将字符串按如下格式输出: ... -
OMG,12 个精致的 Java 字符串操作小技巧,学它
2020-08-26 05:40:20} } 输出结果如下所示: true false 沉默王二 1)String s1 = "沉默王二",Java 在字符串常量池中创建“沉默王二”这串字符的对象,并且把地址引用赋值给 s1 2)String s2 = s1,s2 和 s1 指向了同一个地址引用——... -
Python数据分析--1.1Numpy多维数组的创建与访问
2020-11-28 21:09:02NumPy的本质还是一个多维的数组对象,看到这句话的你,一定会有一个疑问。它的原因是这样的,虽然我们之前学习过的数组对象和NumPy的数据表示看似一样,但是数组是无法直接参与数值运算的。而NumPy提供了非常多的... -
创建一个静态数组
2014-08-10 10:19:50可能这句话可能应该如下: 因为指针解引用比直接访问值慢,访问参数传递的地址比访问参数通过引用传递慢。 我想(我假设),参数通过值将长是因为他们已被复制。 [原来参考通常由编译器实现的(引擎盖下)... -
JAVA中如何判断一个字符串是否换行
2021-02-13 02:29:56JAVA中如何判断一个字符串是否换行if(str.contains("\n") || str.contains("\r\n")){ System.out.println("yyyyyyy");}else{ System.out.println("nnnnnnn");}// 检查一个字符换是否有换行符Java如何判断一个字符串... -
python 实现将list转成字符串,中间用空格隔开
2021-01-29 05:36:41在python中 为什么用str()将列表转换为字符串后,中可以使用字符串的join方法,可以把列表的各个zd元素连接起来,字符串就是连个列表各元素的连接符。 >>> l = ['I', 'want', 'a', 'apple', 'pi'] >>&...