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+1)=‘q‘;
    *(p+1)=‘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

5               char a[] = "hello world1";
(gdb) p a
$1 = "\000<\006??\005????"//空
(gdb) s
6               char *p = "hello world2";
(gdb) p a
$2 = "hello world1"
(gdb) p &a
$3 = (char (*)[13]) 0xbfde0583  //在栈
(gdb) s
7               *(a+1)=‘q‘;
(gdb) p p
$4 = 0x80484c0 "hello world2"  //在数据段
(gdb) p &p
$5 = (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;
时间: 2024-12-10 16:54:56

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

char * p = &quot;abc&quot;与const char *p = &quot;abc&quot;

char * p = "abc"与const char *p = "abc"的区别是什么呢? 第一个语句会产生问题: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] 此时我们只需要改成第二个用法警告就消失了,这是为什么呢? 我们来分别理解以下两个语句,首先要清楚的是char * p语句定义的p是一个指针变量,假设我们用的是第一个语句,那么我们所表达的意思

在函数体内声明[1] char *str=”abc”;和[2] char str[]={‘a’,’b’,’c’}有什么区别?

在函数体内声明[1] char *str="abc";和[2] char str[]={'a','b','c'}有什么区别 1.   [1][2]中str变量都分配在栈上:备注:([1]是字符指针,准确的说类似于字符串数组的功能 ,等价于 char str[]="abc", [2]是字符数组) sizeof()和strlen()计算的时候不一样 2.    [1]中str指向常量存储区的字符串"abc",其中字符串末尾会补0 3.    [2]中

Oracle varchar2或char类型的byte和char的区别

Oracle定义字符串类型VARCHAR2和CHAR指定长度的用法如下: varchar2(<SIZE> <BYTE|CHAR>) <SIZE>是介于1~4000之间的一个数,表示最多占用4000字节的存储空间.char(<SIZE> <BYTE|CHAR>) <SIZE>是介于1~2000之间的一个数,表示最多占用2000字节的存储空间.那其中的BYTE和CHAR有什么区别呢BYTE,用字节指定:VARCHAR2(10 BYTE).

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

1. 前者定义P为常量,即只能单向赋值一次,P++展开为p=p+1,重复赋值给常量,出错,后者P为地址变量,地址变量是指向该变量的存储地址值如:4B3F6A,不能赋给一个字符值(字符相当于ascii表中对应的整数)如强制赋值,会把原地址变量P变为一个两位数的整数,造成地址指针溢出.而p++,则表示把该地址变量向下一个存储单元移动一位,如4B3F6A到4B3F6B.所以合法. 2.char *const p 修饰指针为常量 指针指向内容可以是变量~既 p++这样的操作不合法 *p='3' 合法 c

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

#include <iostream> #include <string> using namespace std; void convertUnCharToStr(char* str, unsigned char* UnChar, int ucLen) { int i = 0; for(i = 0; i < ucLen; i++) { //格式化输str,每unsigned char 转换字符占两位置%x写输%X写输 sprintf(str + i * 2, "%

Delphi7中的Char和XE中的Char

我用FillChar()函数时,发现两个版本中的Char不一样. 在delphi7中 procedure TForm2.Button1Click(Sender: TObject); var s: array[0..3] of Char; i: integer; begin FillChar(s, SizeOf(s), '1'); // 填充字符 ShowMessage(s); // 1111 end; 在XE中同样的代码,s却是这样: 把Char改成AnsiChar 就可以了 可能是应为delp

Java中的char和C++中的char是不同的

在C++中 在C++中,char是基础数据类型,8位,1个字节.byte不是基础数据类型,一般是typedef unsigned char byte;这样子的,也就是说,byte其实是unsigned char类型,那么也是8位,1个字节.不同的是,char可以表示的范围是-128-127,而byte可以表示的范围是0-255. 在Java中 在java中,char和byte都是基础数据类型,其中的byte和C++中的char类型是一样的,8位,1个字节,-128-127.但是,char类型,是

C++ 中类型转换 xmlChar * 与Char * 转换,Char *与int 转换,Char *与Float转换,int 与portNumBits转换

使用libxml2 得到一个节点的内容: xmlChar *value = xmlNodeGetContent(node) 1.XmlChar 转换成Char char * stream = (char *) value; 2.Char *与  int 转换 int x = atoi(stream); #include "stdio.h" #include "stdlib.h" main() { char *p="1234567"; int x;

对栈元素排序

对栈元素排序,借助另外一个栈,主要是对vector的尾部进行操作. /***************************************************** * \file twoStacksSort.cpp * \date 2016/05/07 23:58 * \问题描述: 请编写一个程序,按升序对栈进行排序(即最大元素位于栈顶),要求最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中. 给定一个int[] numbers(C++中为vector&lti