Chinaunix首页 | 论坛 | 博客
  • 博客访问: 133456
  • 博文数量: 38
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 191
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-16 11:31
个人简介

嵌入式新人

文章分类

全部博文(38)

文章存档

2016年(38)

我的朋友

分类: 嵌入式

2016-08-07 22:17:18

高级语言,如javaC#使用字符串关键字String来定义字符串变量,String s1 = "linux";C语言没有原生字符串关键字,字符串的定义是通过字符指针间接实现的。

1 字符指针管理字符串

C语言中定义字符串方法是,定义一个字符指针P,然后P指向字符串的起始地址,


  1. #include <stdio.h>
  2. void main (void )
  3. {
  4. char *p = "linux"; // 指针p存在栈中,字符串linux存在代码段中
  5.      int j = 0;
  6.      for( j = 0;j < 5;j++)
  7.      {
  8.            printf("%c",*p++);
  9.      }
  10.      printf("\n");
  11. }


可见,C语言中字符串是由连续分布的多个字符构成的(类似于数组,字符串和字符数组非常像),使用字符指针定义字符串的实质是

1)指针指向第一个字符地址,

2)字符串以'\0'结尾,’\0’是隐式加入的,作为字符串结尾的标识符,

3)组成字符串的各字符彼此地址相连。

2 关于字符串的说明

2.1 字符串结尾标识符 '\0'

'\0'ASCII字符,即编码为0的字符(null),需要注意区分'\0'和数字0,数字0的编码是48

'\0'作为一个特殊的数字被定义为字符串结尾标志,副作用就是:字符串中无法包含'\0'这个字符。(C语言中不可能存在一个包含'\0'字符的字符串),这种思路就叫“魔数”(魔数就是选出来的一个特殊的数字,这个数字表示一个特殊的含义,你的正式内容中不能包含这个魔数作为内容)。

 

2.2  区分字符指针和字符串

char *p = "linux";

p本质上字符指针,占4字节,分配在栈上;

"linux"是字符串,占6个字节(包括’\0’),分配在代码段,这个代码实际占用10个字节。

 

字符串和字符数组

C语言中存储多个连续字符(如linux)实际上有两种方式

1)字符串,

2)字符数组


  1. #include <stdio.h>
  2. void main (void )
  3. {
  4. char *p = "linux"; // 指针p存在栈中,字符串linux存在代码段中
  5.      int j = 0;
  6.      for( j = 0;j < 5;j++)
  7.      {
  8.            printf("%c",*p++);
  9.      }
  10.      printf("\n");
  11.  
  12.      char a[5] = "linux";
  13.      int i = 0;
  14.      for( i = 0;i < 5;i++)
  15.      {
  16.            printf("%c",a[i]);
  17.      }
  18. printf("\n");
  19. }

 

3.1 字符数组与字符串的本质差异(内存分配角度)

3.1.1 字符数组

字符数组char a[5] = "linux";定义了一个数组a,数组a6字节,右值"linux"本身只存在于编译器中,编译器用它初始化字符数组a后丢弃掉(也就是说内存中是没有"linux"这个字符串的),仅有5个连续分布的字符'l', 'i', 'n', 'u', 'x'

char a[5] = "linux"   相当于是char a[] = {'l', 'i', 'n', 'u', 'x', '\0'};

3.1.2 字符串

char *p = "linux";定义了一个字符指针pp4字节,分配在栈上;同时还定义了一个字符串"linux",分配在代码段;然后把代码段中的字符串(一共占6字节)的首地址(也就是'l'的地址)赋值给p

可见,字符数组和字符串有本质差别。字符数组本身是数组,将字符串作为离散字符存储;而字符串则有字符指针p和字符串两部分,字符串存在代码段中,将首字符的地址赋给字符指针p

 

阅读(1325) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~