C++字符串指针与字符数组的区别
今天发现这样一个问题
#include <iostream> using namespace std; int main() { ]; strcpy_s(ch1,");//编译通过 ]; strcpy_s(p,");//报错:不接受2个参数 }
改成如下所示就没有问题:
strcpy_s(p,,");//编译通过
为什么会这样呢?
先看下字符数组与字符串指针的区别:
1.由双引号括起来的字符串常量属于静态存储类型,它被存储在内存的静态存储区内,所以无论字符串常量出现在程序的什么地方,它在程序的整个运行过程中只存储一份。
如果用字符串常量初始化字符数组,就是从静态存储区把整个字符串复制给数组。例如:
char a[] = "hello";
如果用字符串常量初始化字符指针,就是把字符串在静态存储区的地址复制给指针。例如:
char *p = "world";
这两种形式的一个重要区别是不能通过指针来修改字符串的值,但是字符数组不存在这个问题,如
语句是错误的:
p[] = 'p';
而如下语句没有问题:
a[] = 'a';
为了避免通过指针修改字符串的错误,建议将字符指针声明为const类型,如下所示:
const char *p = "world";
例如:
.int main() { ]="hello world!"; //char *str1="hello world!"; str1[]='A'; //若str1是指针型的,编译通过,但运行是此处会段错误 printf("%s\n",str1); ; }
2.数组和指针都可以在它们的定义中用字符串常量进行初始化,尽管看上去一样,底层的实现机制却不相同。
定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义的同时赋值给指针一个字符串常量进行初始化。例如:下面的定义创建了一个字符串常量(为其分配了内存):
char *p=”abcdefg”;
注意只有对字符串常量才是如此,不能指望为浮点数之类的常量分配空间,如:
Float *p=2.34; /*错误,无法通过编译*/
下面结合一个实例谈谈初始化指针时创建的字符串常量与数组中的字符串的区别:
- 在ANSI C中,初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。在有些编译器中,字符串常量被存放在只允许读取的文本段中,以防止它被修改。
- 数组也可以用字符串常量进行初始化:
Char a[]=”abcdefg”;
如指针相反,由字符串常量初始化的数组是可以修改的。其中的单个字符在以后可以改变。
下面是一个在vc6中的一个例子,完成将一个字符串中的所有大写字母全部转换为小写字母的功能:
#include<iostream> #include<ctype.h> using namespace std; /******************************************************************************/ /* * Convert a string to lower case */ int strlower(char *string) { if(string==NULL) { ; } while(*string) { if(isupper(*string)) *string=tolower(*string); string++; } *string='\0'; ; } /* char *strlower(char *string) { char *s; if(string == NULL) { return NULL; } s = string; while(*s) { if(isupper(*s)) { *s = (char) tolower(*s); } s++; } *s = '\0'; return string; } */ void main() { char *test="ABCDEFGhijklmN"; strlower(test); cout<<test<<endl; }
其中,如果采用char *test=”ABCDEFGhijklmN”;会产生运行时错误。Char test[]=”ABCDEFGhijklmN”则程序正常运行,原因如前所述。
C++字符串指针与字符数组的区别的更多相关文章
- Delphi的字符(Char),字符串(String),字符串指针(PChar),字符数组arrayofchar(来自http://delphi.cjcsoft.net/论坛)
Delphi有三种类型的字符: AnsiChar这是标准的1字节的ANSI字符,程序员都对它比较熟悉. WideChar这是2字节的Unicode字符. Char在目前相当于AnsiChar,但在De ...
- c字符指针与字符数组的区别
1.定义 char *pchar; //定义了指针,没赋值之前不能使用.如果:printf("*pchar:%c\n",*pchar); 出现段错误Segmentation fa ...
- 【转载】C#中将字符串分割成字符数组
在C#中字符串类型String是由一系列的单个字符组合而成,其实可以通过字符串String对象ToCharArray()方法来将字符串中的元素逐一存在数据类型为Char的一维数组中. 例如将字符str ...
- 【C】字符串常量和字符数组
此次博客是转载某位博主的文章,不过现在找不到了,所以先声明一下. 先贴一段代码: #include <stdio.h> int main(int argc, const char** ar ...
- String.getBytes()和String.tocharArray(),字节数组和字符数组的区别
String.getBytes()是将字符串转化为一个字节数组.而String.toCharArray()是将一个字符串转化为一个字符数组. [例如] byte bys[] ="国庆60周年 ...
- Codeforces Round #369 (Div. 2) A. Bus to Udayland【字符串/二维字符数组求连起来的座位并改为其他字符】
A. Bus to Udayland time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- C++ code:char pointers and char arrays(字符指针与字符数组)
C-串的正确赋值.复制.修改.比较.连接等方式. #include<iostream> #pragma warning(disable: 4996)//这一句是为了解决“strrev”出现 ...
- Linux C\C++基础 字符数组、字符串和字符串常量
1.字符数组和字符串 C语言没有字符串类型,用字符数组模拟 字符串一定是字符数组,字符数组不一定是字符串 如果字符数组以字符'\0'('\0'等同与数字0)结尾,那么这个字符数组就是字符串 char ...
- C语言中整形数组、字符数组、字符串的区别
一. 第一 整型数组的存放,数组最后是不加'\0'的,字符串会自动加上,因此存放字符的时候数组的大小要比实际字符的多一个 第二 整型数组 每一个单元是4个字节的,字符串是一个一个字符存放的,每个字符占 ...
随机推荐
- Android实现摇晃手机的监听
摘自:http://blog.csdn.net/xwren362922604/article/details/8515343 监听摇晃手机的类: /** * @author renxinwei ...
- poj3358:欧拉定理
又是一道用欧拉定理解的题..嗯,关键还是要建好方程,注意一些化简技巧 题目大意: 给定一个由 p / q 生成的循环小数,求此循环小数在二进制表示下的最小循环节以及不是循环节的前缀 思路: 小数化为二 ...
- 用Update Select批量更新某一字段的值[可以跨库]
SQL:UPDATE test1 SET name = (SELECT y.name FROM DB2.dbo.test2 y WHERE test1.id = y.id)
- 学习phpcms模板方法:
1.改官方模板,读里面的代码,改改它,看看有什么变化,如果不明白,去官方论 坛.查手册.专业人士还可以看数据库.2.复制实例代码,整理笔记,到实战的时候,就直接复制,改改参数即可.
- Android 读取手机某个文件夹目录及子文件夹中所有的txt文件
1. activity_main.xml文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro ...
- poj 1236 Network of Schools(tarjan+缩点)
Network of Schools Description A number of schools are connected to a computer network. Agreements h ...
- hdu 4983 Goffi and GCD(欧拉函数)
Problem Description Goffi is doing his math homework and he finds an equality on his text book: gcd( ...
- Odometer使用JavaScript和CSS制作数字滑动效果
Odometer是一个使用JavaScript和CSS技术,制作出数字上下滑动的动画效果插件,有点类似与我们的天然气的读数的动画效果,这个插件是轻量级的,压缩版本只有3kg,使用CSS3动画技术,所以 ...
- core_cm3文件函数一览
core_cm3是ARM公司推出来的统一规定,这是对下游芯片厂商的统一规定,因此可以再Cortex-M3(CM3)之间进行移植.此文件中定义了一些对特殊功能寄存器的C语言形式的操作,本质上是内敛汇编和 ...
- 基础总结篇之中的一个:Activity生命周期
子曰:溫故而知新,能够為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就全然掌握,那基本不大可能,所以我们须要常常回过头再细致研读几遍,以领悟到作者的思想精 ...