字符数组与字符串指针

字符数组:

数组名是一个指针常量,不能直接赋值,即 char str[10]; str = "abcd";

不能出现对数组名的自加或者自减,即str++, str--;

 1 //字符数组(C风格字符串)
 2 int main(){
 3     char str1[] = "abc";
 4     char str2[] = {‘a‘, ‘b‘, ‘c‘};//不以空字符结束,产生未定义行为
 5     char str3[] = {"abc"};
 6     char str4[] = {‘a‘, ‘b‘, ‘c‘, ‘\0‘};
 7     printf("str1: %s\n", str1);
 8     printf("str2: %s\n", str2);
 9     printf("str3: %s\n", str3);
10     printf("str4: %s\n", str4);
11     return 0;
12 }

上述printf后的结果,除了第二个str2可能超出abc的长度,其他三个都是等价的,结果为abc。

当使用数组时真正用的是指向数组首元素的地址。str1[2] = (str1 + 2)所指向的元素。



字符串指针:

指向常量数据区,不能更改指向常量的内容,即不能有*p=XXXXX;

可以改变字符指针变量的值,即p本身,p=XXX。

1 int main(){
2     char *p1 = "abc";
3     char *p2 = p1 + 1;
4     printf("p1: %s\n", p1);
5     printf("p2: %s\n", p2);
6     return 0;
7 }

p1是常量字符串abc的首地址,输出结果是abc。p2是“abc”第二个字符的地址,输出结果是bc。

 1 int main(){
 2     const char str1[] = "abc";
 3     const char str2[] = "abc";
 4     const char *p1 = "abc";
 5     const char *p2 = "abc";
 6
 7     printf("%d %d %d %d", str1, str2, p1, p2);
 8     return 0;
 9 }
10 //结果是str1和str2地址不一样
11 //p1和p2地址相同

str1和str2是两个字符数组的首地址;p1和p2是字符串常量的地址,而该字符串常量是一样的,所以p1和p2的值都是字符串常量abc的值。

查看了str1和str2的值,二者相差了4,而且是str1>str2,这也证明了C++中栈的生长方向是向下的,向着内存地址减小的方向增长。

详细的关于C/C++堆、栈等数据区内容。

时间: 2024-11-03 12:51:48

字符数组与字符串指针的相关文章

字符数组和字符串指针的定义

今天在看书上的一段代码的时候发现有一段代码有问题,对于那段代码的错误进行一下解释. 并加强一下我们常用的两种定义字符串的方法的一些区别进行一下解释. 书上的错误代码大概如下: #include<stdio.h> void copy(char *x,char *y) { for(;*y!='\0';x++,y++) *x=*y; *x='\0'; printf("%s\n",a); } int main() { char *a="Hello!"; char

C语言中字符数组和字符串指针分析

这几天搞Unix上的C程序,里面用到了很多字符数组和字符串指针,我记得在学完C语言后相当一段时间里,对指针这个东西还是模模糊糊,后来工作也没怎么 用到过C,虽然网上这类的文章也有很多,还是决定自己在这做个小总结,也算加深下自己的印象,写了下面的测试程序: #include <stdio.h> int main(int argc, char *argv[]){ char day[15] = "abcdefghijklmn";  char* strTmp = "opq

C++基础之字符数组和字符串

无意中发现了一个非常有意思的技术类型小品文系列,通过大牛指导菜鸟的方式,解说讲C++知识,有的非常基础却是开发中easy忽略的地方. [Elminster的专栏] http://blog.csdn.net/Elminster/article/contents [Solmyr 的小品文系列之中的一个:字符串放在哪里? ] http://blog.csdn.net/elminster/article/details/9730 转帖至此,给出链接,原文就不贴了,总结并扩展一下方便以后回想. 字符数组(

c语言字符数组与字符串的使用详解

转自:http://www.jb51.net/article/37456.htm 1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ 'I',' ','a','m',' ',‘h','a','p','p','y'};即把10个字符分别赋给str[0]到str[9]10个元素如果花括号中提供的字符个数大于数组长度,则按语法错误处理:若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 '\0' ). 2.

C语言字符数组与字符串

5.5.1 字符数组与字符串区别 l  C语言中没有字符串这种数据类型,可以通过char的数组来替代: l  字符串一定是一个char的数组,但char的数组未必是字符串: l  数字0(和字符'\0'等价)结尾的char数组就是一个字符串,但如果char数组没有以数字0结尾,那么就不是一个字符串,只是普通字符数组,所以字符串是一种特殊的char的数组. 1 #include <stdio.h> 2 3 4 5 int main() 6 7 { 8 9 char c1[] = { 'c', '

关注C++细节——字面值初始化字符数组及字符串拷贝注意

char carr[] = "author:CSDN-iaccepted"; 此时,carr数组中元素的个数为21,最后一个位置用来存放空字符'\0'. 所以如果写成carr[21] = "author:CSDN-iaccepted";就是错误的. int clen = strlen(carr); int size = sizeof(carr); 这时候得到的clen = 21,size= 22.这就是因为strlen统计串中字符的个数,不计算最后的空字符,但是si

关于“C语言中的字符数组和字符串”一些需要注意的基础点

在C语言中,没有类似Java的String类对字符串的处理,字符串的包装可以采用字符数组. 先看字符数组: #include<stdio.h> void main() { char array[] = {'a','b','c'}; int str = sizeof(array)/sizeof(char); printf("%d",str); } 此时的输出结果为:3,即字符数组的长度为3. 下面我们用字符串初始化字符数组,代码如下. #include<stdio.h&

Base64 报错 的解决办法 (Base-64 字符数组或字符串的长度无效。, 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符。)

Base64 报错 的解决办法, 报错如下:1. FormatException: The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or a non-white space character among the padding characters. ]    System.Convert.FromBase64Str

到底使用字符数组还是字符串常量

在c语言中有两种表示字符串的方法,一种是字符数组,一种是字符串常量 在编程过程中如果只涉及到对字符串的读取,那么字符数组和字符串常量都能够满足要求:如果有写入(修改)操作,那么只能使用字符数组,不能使用字符串常量. 字符串数组与字符串常量之间的区别: 最根本的区别是在内存中的存储区域不一样,字符数组存储在全局数据区或栈区,第二种形式的字符串存储在常量区.全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限,而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限.下面的例子演示了如何