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修饰.这句话背后的内涵是什么?下面就刨根问底一下:) 这个行为在不 ...
随机推荐
- Python库-BeautifulSoup
sp = BeautifulSoup.bs4.BeautifulSoup(html.text,"html.parser") 方法 1.sp.title 返回网页标题 2.sp.te ...
- VBA7种遍历方法
Sub 在选定文档最后加入一句话() '遍历文件 Dim MyDialog As FileDialog On Error Resume NextApplication.ScreenUpdating = ...
- [转载]Linux驱动mmap内存映射
原文地址:https://www.cnblogs.com/wanghuaijun/p/7624564.html mmap在linux哪里? 什么是mmap? 上图说了,mmap是操作这些设备的一种方法 ...
- java代码------实现从控制台输入整型,
总结:主要是方法的调用不能错,比如浮点型,整型,字节型,so.on int ====hasNextInt() float--------hasNextfloat() short ====hasNext ...
- 1、Window.document对象
1.Window.document对象 一.找到元素: docunment.getElementById("id"):根据id找,最多找一个: var a =docunmen ...
- 大白话系列之C#委托与事件讲解大结局
声明:本系列非原创,因为太精彩才转载,如有侵权请通知删除,原文:http://www.cnblogs.com/wudiwushen/archive/2010/04/20/1698795.html 今天 ...
- c++ 双向链表操作总结
第一.包含DoubleLinkNode 模板类和DoubleLinkList 模板类 #pragma once #include<iostream> using namespace std ...
- java 堆、栈、常量池等
寄存器:我们在程序中无法控制 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 堆:存放用new产生的数据 静态域:存放在对象中用static定义的静态成员 常量池:存放常量 ...
- 记-cloudstack 更改二级存储
一.问题是由于当初把二级存储挂载到了根分区的文件系统内,并随着慢慢的模板的增加,容量越来越小. 1.先在cloud 网页界面禁用cloudstack区域 2.然后停止cloudstack-manage ...
- 为什么 ReactJS 不适合复杂的前端项目?
问题一:ReactJS组件难以在复杂交互页面中复用 ReactJS中的最小复用单位是组件.ReactJS的组件比AngularJS的Controller和View 要轻量些. 每个组件只需要前端开发者 ...