转自:jianchi88
http://blog.csdn.net/jianchi88/article/details/6876405
#include<stdio.h>
int main()
{
char a[] = "hello world1";
char *p = "hello world2";
*(a+)='q';
*(p+)='q';
printf("%s\n",a);
printf("%s\n",p);
}

运行结果

段错误。

注释 *(p+1)='q';

运行结果

hqllo world1

hello world2

原因:

一、a与p类型不同:p为指向字符串的指针;a为保存字符串的数组。

   char a[] = "hello world1";   是个赋初值的字符数组。
  char *p = "hello world2";  是个字符串常量指针;

指针变量p在栈里面

字符串常量"hello world2"在全局数据区,数据段,只读,不可写

二、"hello world2"和"hello world1"字符串保存的位置不同。"hello world1"保存在栈
    中,可用*(a+1)='q'修改,"hello world2"保存在全局数据
    区,位置是在.rodata中,不能修改*(p+1)='q'

三、只有2中情况下,数组名不可等同视为数组指针,&与sizeof操作符
    “&”的区别:
    &p取得是指针变量的地址,而非字符串"hello world2"的首地址,p指向字符串的首地址;&a取得
    就是字符串"hello"的首地址。
    “siziof”的区别:
    下面假设在ia32平台上运行,保存变量的内存空间不同。
    sizeof(p); // return 4, pointer size
    sizeof(a); // return 13, array size

               char a[] = "hello world1";
(gdb) p a
$ = "\000<\006޿�\005޿�?�"//空
(gdb) s
char *p = "hello world2";
(gdb) p a
$ = "hello world1"
(gdb) p &a
$ = (char (*)[]) 0xbfde0583 //在栈
(gdb) s
*(a+)='q';
(gdb) p p
$ = 0x80484c0 "hello world2" //在数据段
(gdb) p &p
$ = (char **) 0xbfde0590 //在栈

————————————————————————————————————————————————————————————————————————————————————————————

面试题知识点:

  当指针赋值给相同的常量字符串时,它们实际上会指向相同的内存地址,但是常量内存初始化数组,情况确不一样。

char str1[] = "hello world";
char str2[] = "hello world";
string* str3 = "hello world";
string* str4 = "hello world";
问str1 == str2是否成立?str3 == str4是否成立?
(提示,前一个不成立,后一个成立)
    char a[] = "hello world";
char b[] = "hello world";
char *str1="hello world";
char *str2="hello world"; 前两个不同,后两个相同,即a!=b;str1==str2;

char a[] = "hello world1"和char *p = "hello world2";的区别(转)的更多相关文章

  1. 理解extern char s[100]与extern char *s

    在x.c中定义了一个字符数组 char s[100],在l.c中进行引用extern char s[200], 有些c程序新手经常把它写成extern char *s. 这两种写法的含义一样吗? 首先 ...

  2. char * p = "abc"与const char *p = "abc"

    char * p = "abc"与const char *p = "abc"的区别是什么呢? 第一个语句会产生问题: warning: deprecated c ...

  3. char、varchar、nchar、nvarchar、text的区别

    char.varchar.nchar.nvarchar.text的区别 1.有var前缀的,表示是实际存储空间是变长的,varchar,nvarchar 所谓定长就是长度固定的,当输入的数据长度没有达 ...

  4. 20130324 LBP CSLBP 全局存储区 局部存储区 char c[]=”hello world”和char *str=”hello world”的区别

    1.LBP and CSLBP 2.再论char c[]=”hello world”和char *str=”hello world”的区别 /**************代码1************ ...

  5. char s[]字串和char *s字串有什麼区别?

    C語言有兩種字串宣告方式char s[]和char *s,兩者有什麼差異呢? Introduction char s[] = "Hello World"; (只是用字符串常量初始化 ...

  6. C语言char*字符串数组和unsigned char[]数组的相互转换

    #include <iostream> #include <string> using namespace std; void convertUnCharToStr(char* ...

  7. Delphi7中的Char和XE中的Char

    我用FillChar()函数时,发现两个版本中的Char不一样. 在delphi7中 procedure TForm2.Button1Click(Sender: TObject); var s: ar ...

  8. char * const p和const char *p的区别

    1. 前者定义P为常量,即只能单向赋值一次,P++展开为p=p+1,重复赋值给常量,出错,后者P为地址变量,地址变量是指向该变量的存储地址值如:4B3F6A,不能赋给一个字符值(字符相当于ascii表 ...

  9. C/C++中char* p = "hello" 和 const char* p = "hello"的区别

    在写代码常常都会写char * p ="hello";这样的代码,虽然不是错误,但却不建议这样用.应该加const修饰.这句话背后的内涵是什么?下面就刨根问底一下:) 这个行为在不 ...

随机推荐

  1. springboot+idea 热部署

    1 配置pom.xml <!--spring-boot-devtools 热部署--> <dependency> <groupId>org.springframew ...

  2. jq form表单自动赋值

    (function ($) { $.fn.extend({ initForm: function (options) { //默认参数 var defaults = { formdata: " ...

  3. Codeforces 982C(dfs+思维)

    C. Cut 'em all! time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  4. 杂项:Hadoop

    ylbtech-杂项:Hadoop Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储.Ha ...

  5. Vim编辑器基本操作学习(二)

    操作符+位移 x命令可以删除一个字符,4x可以删除4个字符. dw可以删除一个word,w事实上是向后移动一个word的命令:dw可以接上一个任意一个位移命令,它将删除从当前光标开始到位移终点处的文本 ...

  6. node中express的中间件之basicAuth

    basicAuth中间件为网站添加身份认证功能.在使用了该中间件后, 用户访问网站时必须输入用户名与密码,在用户输入了用户名与密码并通过验证之后才能访问网站. 当用户输入的用户名和密码符合条件,中间件 ...

  7. Timestamp类型浅析

    Oracle针对不同的数据需求,提供了多种类.多层次的数据类型体系.我们在实际应用中,最好可以依据业务数据的实际形态和前端应用的语言.框架特性来确定字段类型的选择. Date类型是我们经常使用的时间类 ...

  8. css ! important 兼容性的一点测试

    css ! important 这个东西网上一堆内容,我只说我用到的一点地方和我的理解, 这个东西ie6不支持,ie高版本是支持的.其他浏览器也是支持.先理解这一点 .abc { width:100p ...

  9. CentOS7.6安装Redis

    官网下载地址:https://redis.io/download 第一步:软件下载安装 进行安装目录:cd /opt/software (如果目录不存在,请先创建目录) 下载二进制包:wget htt ...

  10. scrapy核心组件工作流程和post请求

    一 . 五大核心组件的工作流程 引擎(Scrapy)用来处理整个系统的数据流处理, 触发事务(框架核心) 调度器(Scheduler)用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返 ...