char a[] = "hello world1"和char *p = "hello world2";的区别(转)
转自: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";的区别(转)的更多相关文章
- 理解extern char s[100]与extern char *s
在x.c中定义了一个字符数组 char s[100],在l.c中进行引用extern char s[200], 有些c程序新手经常把它写成extern char *s. 这两种写法的含义一样吗? 首先 ...
- char * p = "abc"与const char *p = "abc"
char * p = "abc"与const char *p = "abc"的区别是什么呢? 第一个语句会产生问题: warning: deprecated c ...
- char、varchar、nchar、nvarchar、text的区别
char.varchar.nchar.nvarchar.text的区别 1.有var前缀的,表示是实际存储空间是变长的,varchar,nvarchar 所谓定长就是长度固定的,当输入的数据长度没有达 ...
- 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************ ...
- char s[]字串和char *s字串有什麼区别?
C語言有兩種字串宣告方式char s[]和char *s,兩者有什麼差異呢? Introduction char s[] = "Hello World"; (只是用字符串常量初始化 ...
- C语言char*字符串数组和unsigned char[]数组的相互转换
#include <iostream> #include <string> using namespace std; void convertUnCharToStr(char* ...
- Delphi7中的Char和XE中的Char
我用FillChar()函数时,发现两个版本中的Char不一样. 在delphi7中 procedure TForm2.Button1Click(Sender: TObject); var s: ar ...
- char * const p和const char *p的区别
1. 前者定义P为常量,即只能单向赋值一次,P++展开为p=p+1,重复赋值给常量,出错,后者P为地址变量,地址变量是指向该变量的存储地址值如:4B3F6A,不能赋给一个字符值(字符相当于ascii表 ...
- C/C++中char* p = "hello" 和 const char* p = "hello"的区别
在写代码常常都会写char * p ="hello";这样的代码,虽然不是错误,但却不建议这样用.应该加const修饰.这句话背后的内涵是什么?下面就刨根问底一下:) 这个行为在不 ...
随机推荐
- one2many &&many2many
只记录双向的情况(双向是单向的一种) @OneToMany 和 @ManyToOne :一个Group 包含多个 User; Group.class package com.XX.model; im ...
- window 2003 实现多用户远程登录
1.单击开始->运行,输入gpedit.msc,打开组策略编辑器,找到计算机配置 ->管理模版 -> Windows组件 ->终端服务.把限制连接数量的属性修改成我们需要的数字 ...
- [知识整理]Linux系统WIFI知识的一些整理
前段时间接触了wifi,主要是在linux系统下做预研.开发.本文根据个人收集资料及研究经验做了一些基本入门级别的引子,旨在对wifi有一个很基础的入门的认知,比如知道wifi模块硬件接口有哪些,了解 ...
- Hibernate保存Blob和Clob类型的数据
虽然非常不建议在数据库中保存Blob和Clob类型的数据,但真的要有这样的需求呢?这里记录一下使用Hibernate如何向数据库中保存Blob和Clob数据. Oracle和MySql在Blob类型上 ...
- 分析java类的初始化契机
分析java类的静态成员变量初始化先于非静态成员变量 依上图中当class字节码文件被jvm虚拟机加载到内存中依次经过 连接 验证:对字节码进行验证 准备:给静态变量分配内存并赋予变量类型各自的默 ...
- java后台获取URL带参demo
URL:http://aos.wall.youmi.net/v2/check_fb_sig?order=YM130402cygr_UTb42&app=30996ced018a2a5e& ...
- 第七章 : Git 介绍 (上)[Learn Android Studio 汉化教程]
Learn Android Studio 汉化教程 [翻译]Git介绍 Git版本控制系统(VCS)快速成为Android应用程序开发以及常规的软件编程领域内的事实标准.有别于需要中心服务器支持的早期 ...
- azkaban平台的使用
最近接触一些大数据的测试,有些hadoop/spark任务在服务器测试不太方便,会放到azkaban上跑 简单写下azkaband的使用流程:包括任务的上传和提交任务到hadoop集群 一 登陆azk ...
- 学习 Python 编程的 19 个资源 (转)
学习 Python 编程的 19 个资源 2018-01-07 数据与算法之美 编译:wzhvictor,英文:codecondo segmentfault.com/a/119000000418731 ...
- Linux git 关联 github仓库
背景: 由于最近学习Spring cloud docker 一键部署, 需要把github仓库项目, 放在Linux上面启动, (以下位置在/root/目录中执行)步骤, 1:安装 git >y ...