char s[] 和 char *s 的区别
第一种:
char *a 与char a[] 的区别
char *d = "hello" 中的a是指向第一个字符‘a'的一个指针;char s[20] = "hello" 中数组名a也是执行数组第一个字符'h'的指针。现执行下列操作:strcat(d, s)。把字符串加到指针所指的字串上去,出现段错误,本质原因:*d="0123456789"存放在常量区,是无法修的。而数组是存放在栈中,是可以修改的。两者区别如下:
(1)读写能力:char *a = "abcd"此时"abcd"存放在常量区。通过指针只可以访问字符串常量,而不可以改变它。而char a[20] = "abcd"; 此时 "abcd"存放在栈。可以通过指针去访问和修改数组内容。
(2)赋值时刻:char *a = "abcd"是在编译时就确定了(因为为常量)。而char a[20] = "abcd"; 在运行时确定.
(3)存取效率:char *a = "abcd"; 存于静态存储区。在栈上的数组比指针所指向字符串快。因此慢,而char a[20] = "abcd"存于栈上,快。
另外注意:char a[] = "01234",虽然没有指明字符串的长度,但是此时系统已经开好了,就是大小为6-----'0' '1' '2' '3' '4' '5' '\0',(注意strlen(a)是不计'\0')
第二种:
char s[] 和 char *s 的区别
之前自己写代码碰到 char s[];和char *s 的各种方面总是搞不清楚,知道他们是不一样的,但因为将他们打印出来有都是 相同的地址所以一直懵逼,今天特地网上整理了下,将他们彻底搞定
不同点:
1.在声明时
char *s1="hello";//声明一个指针指向常量"hello"
char s2[]="hello";//在栈中开辟一个数组字符"hello";
/** s2[]="hello" 相当于
* char s2[6];
* s2[0]='h';
* s2[1]='e';
* s2[2]='l';
* s2[3]='l';
* s2[4]='0';
* s2[5]='\0';
**/
说明:
s1内容不能修改,因为他指向常量
s2内容可以修改,因为他指代内存中的变量区
s2其地址和容量在生命期里不能改变
2.使用时
char str[255];//声明一个字符数组str占255个字节
char *p;//声明一个字符串指针p
char *sp;//声明一个字符串指针spsp = str;/**实际上是 sp=&str; 编译器做过处理**/
//需要有一个指针来保存原先地址
p=sp;
*(sp++)='1';
*(sp++)='2';
*sp++='3';//相当于*(sp++)
*sp++='4';
*sp++='5';
*sp='\0';
printf("%s\n",p);printf("%p\n",p);
printf("%p\n",&str);
printf("%p\n",sp-5);
printf("%s\n",(sp-5));//等同于===============================================
int i=0;
char str[255];//声明一个字符数组str占255个字节
char *p;//声明一个字符串指针pp=str;
str[i++]='1';
str[i++]='2';
str[i++]='3';
str[i++]='4';
str[i++]='5';
str[i]='\0';printf("%s\n",p);
printf("%p\n",p);
说明:
char str[] 实际是一个(字符数组)指针,不是(字符)指针
char str[] 不是一个真实意义(声明的)的指针类型,不能进行正常指针的加减计算操作
char *p是一个指针类型可以进行计算操作
相同点:
1.作为形参完全相同
例:
void function(char *s1);
void function(char s1[]);
2.只读取不修改的时候
例:
char *s1="hello";
char s2[]="hello";
printf("s1[1]=[%c]\n",s1[1]); //s1[1]=[e]
printf("s2[1]=[%c]\n",s2[1]); //s2[1]=[e]
printf("s1=[%s]\n",s1); //s1=[hello]
printf("s2=[%s]\n",s2); //s2=[hello]
char s[] 和 char *s 的区别相关推荐
- char str[]与char *str的区别
一个具体例子: main() {char *p="abc123ABC";//char p[]="abc123ABC"int i=0;while(*(p+i)!= ...
- char s []和char * s有什么区别?
在C语言中,可以在这样的声明中使用字符串文字: char s[] = "hello"; 或像这样: char *s = "hello"; 那么区别是什么呢? 我 ...
- char[]数组与char *指针的区别
char[]数组与char *指针的区别 问题描述 虽然很久之前有看过关于char指针和char数组的区别,但是当时没有系统的整理,到现在频繁遇到,在string,char[], char *中迷失了 ...
- int main中char** argv与char *argv[]区别?(main函数)
标准main函数写法(两种都可以): int main(int argc, char** argv){} int main(int argc, char* argc[]){} 怎么还是有点懵逼呢/?? ...
- char str[] 和 char *str 的区别
char* get_str(void) { char str[] = {"abcd"}; return str; } char str[] = {"abcd"} ...
- C++中 char *s 和 char s[] 的区别
原因 刚好看到给main传递参数,书上(C++Primer)说" int main(int argc, char *argv[])也可以写成 int main(int argc, char ...
- C语言高级编程:char、signed char 和 unsigned char的使用区别
1. 区别与联系: 1)在定义字符类型时一般使用char来定义 2)char被当成有符号或是无符号视不同编译器决定,由于ASCII码范围从0-0x7F(127),所以char无论被当成有符号还是无符号 ...
- char *a 与char a[] 的区别和char** argv与char *argv[]区别
char *a 与char a[] 的区别 char *a = "hello" 中的a是指向第一个字符'a'的一个指针 char a[20] = "hello" ...
- cont char *p 和 char* const p 区别及记忆方法
/* cont char *p 和 char* const p 区别及记忆方法 const char *p = "hello"; 和 char const *p = "h ...
最新文章
- 这样就算会了PHP么?-10
- JDK8中好用的日期处理-LocalDate类-LocalTime-LocalDateTIme,mysql解决时区相差13小时的问题,日期格式器DateTimeFormatter
- oracle reverse 反转函数
- java流读取xml_使用FileInputStream(用于Java)读取XML文件?
- 史上最硬核文科生,擅长解决数学难题,却视考试成为终生噩梦
- word删除所有的回车、空格
- USACO 3.2.3 Spin
- 聊聊Socket、TCP/IP、HTTP、FTP及网络编程
- 探访蔚来合肥工厂:是ES8与ES6生产基地 能年产10万台
- Android-Universal-Image-Loader-master(图片浏览+缓存)
- 神经网络matlab仿真,MATLAB神经网络仿真与应用_IT教程网
- 计算机操作系统--思维导图
- 外网/公网出口IP查询方法汇总
- 云南计算机网络技术排名,2017年云南大学排名
- 十秒钟刷完云班课的一节视频
- 前端之HTML学习笔记一(B站黑马程序员)
- 【tf.keras】官方教程一 Keras overview
- python black_如何使用Black自动格式化Python代码
- 【软件测试】黑盒测试技术——等价类划分和边界值分析
- 非常道 2010-4-5日