深入理解字符串指针和字符串数组

原创 2016年05月30日 16:28:46

首先我们来看一段程序:

#include <stdio.h>

int main()
{
        char str[] = "hello code";
        char *ps = "hello code";
        char *p = str;

    
        printf("str: %s\n",str);
        printf("&str: %s\n",&str);
        printf("&&str: %s\n",&p);
        printf("&&str: %p\n",&p);
        printf("---------------------------------\n");
        printf("ps: %s\n",ps);
        printf("&ps(s): %s\n",&ps);
        printf("&ps(p): %p\n",&ps);

        return 0;
}

它的输出结果如图:

分析:我们首先声明了一个字符串数组和一个字符串指针。然后将他们等同类型的输出做对比。

    从输出结果我们可以看到,想要输出整个字符串。分别以%s格式输出str和ps即可。


1.字符串指针名ps和数组名str都存放着字符串的首地址。而字符串本身存放在以该首地址为首的一块连续的内存空间中,并以 '\0' 作为串的结束。

2.对str和ps分别取地址,以%s格式输出。

     &str:  输出的结果仍然是字符串。

     &ps:  输出的结果为乱码。

那么,这是什么原因呢?

    实际上,对于字符串数组,str和&str都一样,都是字符串数组str[]的首地址。但类型不一样,一个是指向char的指针,一个是指向整个数组的指针。但是对他们分别+1效果就不一样了,一个偏移sizeof(char),一个偏移sizeof(char)*11(也就是整个数组的大小)。所以字符串数组可以理解为存在“双层地址”,但是这两个地址值都是一样的,都指向字符串首地址。

    而对于字符串指针,ps和&ps相去甚远了。ps是整个字符串的首地址,由于并不存在类似数组的"双层地址“结构,所以ps已经是指向字符串最底层最基本的地址了,不具有数组名这一地址,只具有“单层地址”,所以对它进行&操作,然后以%s格式输出,这是不合法的,将一个地址以%s输出只能得到乱码。

3.如上图:对于字符串数组,我们加入了一个指针变量p,使它指向str,然后进行&p(相当于&&str)操作,以%s格式输出,结果才出现乱码。而对于字符串指针,只以%s格式输出&ps操作结果就显示乱码。我们将&&str和&ps分别以%p格式打印出来,输出结果显示为正常地址。证实了我们的“双层地址”和“单层地址”一说。







版权声明:本文为博主原创文章,转载请注明出处,谢谢。

linux c 字符数组指针和字符串指针(区别代码段)

字符数组: #include char* show(){ //char* p = "kobe"; char name[] = "xiewenbo\n"; char* p ; p = n...
  • xiewenbo
  • xiewenbo
  • 2012年04月12日 17:16
  • 599

字符串指针和字符串数组

int main() {     // 假设目标是8个长度为5的字符串     int nNum = 8, nLen = 5;     char *pA[1];// 不必定义为 char ...
  • dyzhen
  • dyzhen
  • 2015年04月28日 09:02
  • 277

字符串数组和字符串指针

先看一个例子:char *getStr(){ char str[] = "hello world"; // 生成在栈空间的局部变量 return str; }  不能这样,因为cha...
  • hust_sheng
  • hust_sheng
  • 2015年09月08日 11:54
  • 363

数组指针,字符串指针的几种定义方法

一:数组指针的定义方法int a[10] = {1,2,3,4,5,6,7,8,9,0}; int * p; p = &a[0]; // 等价于p = a;2.int a[10] = {1,2,3...
  • TAaron666
  • TAaron666
  • 2017年07月25日 10:15
  • 374

深入理解JAVA虚拟机--读书笔记

1.jvm 内存结构 1)程序计数器 较小的内存区域,可以看作是当前线程所执行的字节码的行号指示器;每条线程独立; 2)java虚拟机栈 描述java方法执行的内存模型,即每个方法在执行的同时都会创建...
  • dada360778512
  • dada360778512
  • 2014年04月27日 21:40
  • 3016

关于学习Linux的经典书籍 (深入理解Linux内核、Linux设备驱动程序等

成为一名精通 Linux 程序设计的高级程序员一直是不少朋友孜孜以求的目标。根据中华英才网统计数据,北京地区 Linux 程序员月薪平均为 Windows 程序员的 1.8 倍、Java 程序员的 2...
  • sanchuyayun
  • sanchuyayun
  • 2014年07月31日 11:17
  • 1567

使用字符串指针变量和字符数组的区别

用字符数组和字符指针变量都可实现字符串的存储和运算。 但是两者是有区别的。在使用时应注意以下几个问题: 1. 字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首...
  • zhjqxy
  • zhjqxy
  • 2016年11月01日 14:50
  • 448

推荐一本五星好书:深入理解计算机系统(修订版)

from:http://outmyth.blogdriver.com/outmyth/1122212.html 深入理解计算机系统(修订版)         【原书名】 Computer Sy...
  • polar9527
  • polar9527
  • 2014年08月01日 22:56
  • 1016

字符串指针和字符串数组的区别

用字符数组和字符指针变量都可实现字符串的存储和运算。但是两者是有区别的。在使用时应注意以下几个问题: 1.     字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该...
  • yusiguyuan
  • yusiguyuan
  • 2013年10月08日 09:10
  • 1129

字符串数组 和 字符串指针 的区别

在C语言中,对字符串的操作主要有两种方式,一是使用字符数组,char str[];二是使用字符指针。那么二者有什么区别呢?下面将分述二者的使用,最后进行比较。 一、字符数组  ...
  • qq_35212671
  • qq_35212671
  • 2016年12月02日 23:29
  • 100
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入理解字符串指针和字符串数组
举报原因:
原因补充:

(最多只允许输入30个字)