char s[] = "wangshihui";

char *s = "wangshihui";

皆宣告了s字符串,在C-style string的函数皆可使用,但两者背后意义却不相同。

char s[] = "wangshihui";   s指向栈内存

的s是个char array,含11个byte(包含结尾\0),"wangshihui"对s来说是initializer,将字符一个一个地copy进s阵列。

char *s = "wangshihui";   s指向文字常量区,指向的内容为const  相当于const char *s="wangshihui"

的s是一个pointer指向char,由于"wangshihui"本身就是一个string literal,所以s指向"wangshihui"这个string literal的起始存储器位置。

char s1[] = "wangshihui";

char *s2 = "wangshihui";

cout << "size of s1: " << sizeof(s1) << endl;

cout << "size of s2: " << sizeof(s2) << endl;

s1是字符串数组,所以占了11byte(包含字符串结束标志);

而s2只是pointer,所以占了4 byte

实际使用有什么不同吗?两种写法皆可使用substring和pointer写法,但只有char *s可以直接使用*s++写法。

char s[]为阵列,虽然s == &s[0],但s是『常数』,恒等于&s[0]无法改变,但char *s为pointer,指向s[0],但却是变量,可以任意改变,故可用*s++任意更改pointer值。

Conclusion

一般人很少分辨char s[]和char *s的差异,大部分状况下用法相同,但char *s速度略快,因为不需copy的动作,且*s++为C语言常用的写法。

#include <iostream>
#include <cstring>
using namespace std; int main()
{
char s1[] = "wangshihui";
char *s2 = "wangshihui";
cout << "size of s1: " << sizeof(s1) << endl;
cout << "size of s2: " << sizeof(s2) << endl;
cout<<"\n----------\n";
for(int i = 0; i != sizeof(s1)-1; ++i)
{
cout << s1[i];
}
cout<<"\n----------\n";
for(int i = 0; i != strlen(s2); ++i)
{
cout << *(s2 + i);
}
cout<<"\n----------\n";
while(*s2)
cout << *s2++;
cout<<"\n----------\n";
/************
while(*s1)//编译不通过:lvalue required as increment operand|
cout << *s1++;
*************/
}
/************************
size of s1: 11
size of s2: 4 ----------
wangshihui
----------
wangshihui
----------
wangshihui
---------- **************************/

数组字符串与指针字符串的区别 char s[]="***" 和char *s="***"的区别的更多相关文章

  1. c语言指针字符串与字符数组字符串的区别

    #include <stdio.h> int main() { //字符串常量,存放于内存常量区. //常量区区的内存具有缓存机制, //当不同指针指向的常量值相同时, //其实这些指针指 ...

  2. C语言之数组,字符串,指针

    一. 数组的定义 1.  数组初始化 初始化方式 int a[3] = {10, 9, 6}; int a[3] = {10,9}; int a[] = {11, 7, 6}; int a[4] = ...

  3. 字符数组,字符指针,字符串常量,以及sizeof的一些总结

    1.以字符串形式出现的,编译器都会为该字符串自动添加一个\0作为结尾 如在代码中写"abc",编译器帮你存储的是"abc\0". 2.数组的类型是由该数组所存放 ...

  4. 「C」 数组、字符串、指针

    一.数组 (一)数组 概念:用来存储一组数据的构造数据类型 特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素. (二)数组的定义 格式: 类型 数组名[元素个数 ...

  5. 【C++基础】 指针&字符串&数组

    先贴代码,总结以后再写,和5中内存分配方式密切相关 PS: str 返回整个字符串,str[0],*str返回首字符h char *strA(){ char str[]="hello!&qu ...

  6. C语言程序设计--字符串与指针及数组与指针

    数组的基本知识 数组的定义 #define SIZE 5 int array_int[5]; //未声明初始化,默认填零 float array_float[5] = {1.01, 2.23, 3.1 ...

  7. C++ 字符串、string、char *、char[]、const char*的转换和区别

    1.字符串 字符串本质就是一串字符,在C++中大家想到字符串往往第一反应是std::string(后面简称string) 字符串得从C语言说起,string其实是个类,C语言是没有class的,所以C ...

  8. 指向字符串的指针在printf与cout区别

    根据指针用法: * 定义一个指针, &取变量地址, int b = 1; int *a = &b; 则*a =1,但对于字符串而言并非如此,直接打印指向字符串的指针打印的是地址还是字符 ...

  9. c语言实现字符指针(字符串)数组的排序

    需求: "ff555d", "114ddd", "114dd","aaa", "aaab", &qu ...

随机推荐

  1. 转载-- C/S 与 B/S 区别

    C/S 与 B/S 区别   C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可 ...

  2. window.location.href 和self.location的区别

    你从字面上就可以理解到 window 指的是当前窗口 而 self 指的是自己 在HTML 中 由于页面可以镶嵌页面 所以这2个就有了 区别 比如说 我有个页面A.HTML 里面嵌套了一个B.HTML ...

  3. 一个控制台贪吃蛇小游戏(wsad控制移动)

    /******************************************** * 程序名称:MR.DUAN 的贪吃蛇游戏(链表法) * 作 者:WindAutumn <flutti ...

  4. MySql中的时间类型datetime,timestamp,date,year比较

    MySQL日期类型.日期格式.存储空间.日期范围比较.日期类型        存储空间       日期格式                 日期范围------------ ---------   ...

  5. Java反射 - 3(动态代理)

    动态代理是对包装模式的升级,可以动态的传入需要代理的对象实现代理 准备如下 1. 被代理类的接口 2.被代理类 3.处理器:InvocationHandler 4.代理调用:Proxy.newInst ...

  6. 武汉科技大学ACM :1004: 华科版C语言程序设计教程(第二版)课后习题3.7

    Problem Description 输入无符号短整数k[hex.]和p[oct.],将k的高字节作为结果的低字节,p的高字节作为结果的高字节组成一个新的整数. Input k[hex.]和p[oc ...

  7. swing菜单,常用组件,常用容器

    1菜单 import javax.swing.*; import java.awt.*; import java.awt.event.InputEvent; import java.awt.event ...

  8. STL删除vector或list的方法及注意的问题

    删除vector中的元素 1.删除指定的所有对象 STL中remove()只是将待删除元素之后的元素移动到vector的前端,而不是删除.若要真正移除,需要搭配使用erase().例子: vector ...

  9. jQuery自学笔记(二):jQuery选择器

    一.简单选择器 ID选择器:$('#box') 元素标签名:$('div') 类选择器:$('.box') jQuery提供了length和size()两种方法查看返回的元素,可验证ID在页面只出现一 ...

  10. 模拟键盘输入首先要用到一个API函数:keybd_event

    转自:http://www.cnblogs.com/cpcpc/archive/2011/02/22/2123055.html 模拟键盘输入首先要用到一个API函数:keybd_event. 模拟按键 ...