1,首先,不论是局部,静态还是全局数组都必须在定义的时候初始化,否则就得通过其他方式,eg 循环操作,字符串处理函数strcpy()

2,附以下代码: 主要完成将”I am from china ”倒置为”china from am I”,

最开始编写时,将str定义为字符串数组,怎么都出不来结果。半天才发现应该用字符串指针数组

3,那么问题来了,字符串数组和字符串指针数组有什么区别

举个例子  char a[] = "hello";   //字符串数组,存放的是字符

char *b[] = {"hello", "world"};//字符串指针数组,存放的是指针即元素地址,指针指向其中的元素

字符数组初始化  char a[10] ="hello";//字符串以'\0'结尾,这种方式系统会自动在数组未填值的地方添加'\0'

char b[] = {'h', 'e' , 'l', 'l', '\0'};//类似于初始化整型数组,必须要手动在后面添加'\0'

所以当我 这样定义时char a[] = {"hello", "world"};,报错str中有多余的元素。

详细说明:
     假定字符串数据中也以NUL结束字符串

char  arr1[10][100];

char *arr2[10];

内存: arr1是个字符串数组,分配内存 10 * 100 = 1000 个字节。
              arr2是个字符串指针数组,分配内存 10 * 8 = 80 个字节。

标识符: arr1是个该数组第一个指向 100 个char型数据内存的指针。
                形象的理解,arr1是一篇文章(共10行)中的     第一行的首地址。
                arr2是个该数组第一个指向  1  个char型数据(8字节)内存的指针。
                形象的理解,arr2是一篇文章(共10行)中的第一行的     首字符地址。

元素访问: 
        
        a.  arr1[4][0];
             *arr2[4];
            它们都是用于表示访问各自数组中第4行的首字符。

b.  arr1[4]
             arr2[4]
            它们都是用于表达第4行字符串。
            arr1[4]是字符指针常量,arr2[4]是字符指针变量。

c.  char (*parr1)[100];
             char **parr2;
             parr1 = arr1 + 4;
             parr2 = arr2 + 4;
            定义了两个变量,分别接收了两个数组的第4行的数据。
            parr1是指向第4行拥有100个字符的一维数组。
            parr2定义一个指向第4列的一个指针。

d.  char *str1, *str2, *str2, *str4;
             str1 = arr1[4];
             arr1[4]它就是arr1第4行这个有100个字符的一维数组名,是该数组首元素的指针常量。
             str2 = *( arr1 + 4 )
             arr1+4是指向arr1第4行字符的指针,进行间接访问后,得到第4行字符这个一维数组的数组名。
             str3 = arr2[4];
             arr2[4]是arr2的第4个元素,该元素是指向一个字符串的首元素指针。
             str3 = *( arr2 + 4 )
             arr2+4是指向arr2第4个元素的指针,进行间接访问后,得到第4个元素,该元素是一个指向一个字符串首元素的指针。

字符串数组与字符串指针的共同点:
       arr1[4]、*( arr1 + 4 ) 字符指针常量。
       arr2[4]、*( arr2 + 4 ) 字符指针变量。
       它们都是字符指针,只不过一个可以修改指针值,一个不能修改指针值。
       指针变量需要初始化,指针常量在定义时已经完成了初始化。
       若字符串数组中的数据也以NUL结尾,那么这两种指针都可以用字符串标准库函数的实参(因为这些函数都不会改变指针值)。

三种方法:

1.在C语言中,是将字符串作为字符数组来处理的,字符串是逐个存放到数组元素中的,例如用一个一维的字符数组存放字符串"I am a boy.",如下代码:

char c[12] = {'I','a','m','a','b','o','y','.'};
这个字符串的实际长度是11,数组长度是12,实际工作中,人们关心的往往是字符串的有效长度而不是字符串的数组长度,例如要打印字符串,这是就要知道字符串的实际长度。平时常使用下面三种方式来测定字符串的实际长度:
(1)在串值后面加一个不计入长度的结束标记字符,比如'\0'来表示串值的终结

初始化一个字符串的方法如下,在最后添加'\0'

char str[] = {'I','a','m','h','a','p','p','y','\0'};
也可以直接使用字符串常量初始化字符数组(系统自动加上'\0'),这种方法符合人们的习惯。

char str[] = "I am happy";
或者
char str[] = {"I am happy"};
注意:不能使用下面的赋值方式:
char str[20];
str = "I am happy";
但可以用字符指针指向这个字符串:
char *str;
str = "I love China";

(2)将实际串长度值保存在数组0的下标下

#define MAXSIZE 20                        //数组的长度
typdef char String[MAXSIZE+1];
初始化字符串的方法:

String t;
StrAssign(t,"I am happy");                
int StrAssign(String T,char *chars)  
{
    T[0] = strlen(chars);                //下标为0存放数组长度
    for(i=1;i<=strlen(chars);i++)        //下标位置从1开始存放数据
    {
        T[i] = *(chars+i-1);
    }
     return 1;
}
(3)使用结构体类型(自定义类型)

#define MAXSIZE 20
typedef struct{
    char ch[MAXSIZE];
    int len;                
}String;
其中:MAXSIZE表示串的最大长度,ch是存储字符串的一维数组,len是字符串的长度
初始化函数示例:

String t;
 StrAssign(&t,"I am happy");
int StrAssign(String *t,char *chars)
{
    int i;
    if(strlen(chars)>MAXSIZE+1)        //字符串的长度大于数组的长度,操作失败,返回0
        return 0;
    for(i=0;i<strlen(chars);i++)
    {
        t->ch[i] = *(chars+i);        
    }
    t->len = strlen(chars);            //数组的长度
    return 1;                          //返回1,操作成功
}
说明:这里的StrAssign函数的参数t使用的是指针,是因为结构体变量做做形参,用法和普通变量一样属于值传递方式,在子函数中要给t赋值,所以输入的是t的指针。与之对比的是(2)子函数中T是数组,传入的是数组的首地址(改变形参也就改变了实参)。

字符串定义的五种方法

第1种:

char a[5]="hello";
第2种:

char a[]="hello";
第3种:

char* a="hello";
第4种:

char a[10];
gets(a);
第5种:

char* a[5]={"hello",
"nihao",
"good",
"ok",
"bye"};

C语言:字符串数组与字符串指针数组相关推荐

  1. 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  2. c语言字符数组给字符指针,C语言常见有关问题之字符串数组和字符指针数组有关问题...

    C语言常见问题之字符串数组和字符指针数组问题 通过如下的实例来讲解这个问题: #include int main(void) { char a[3][4] = {"123", &q ...

  3. C语言指针数组,数组指针,函数指针,函数指针数组,函数指针数组的指针,回调函数

    C语言指针的一些知识点 指针 指针数组和数组指针的概念 函数指针,函数指针数组,函数指针数组的指针 回调函数 指针 1.指向对象的指针 int *p = new int(10); delete p; ...

  4. C语言里的函数指针、指针数组和函数指针数组

    1.函数指针 函数指针也是一个指针变量,但这个指针存放的是一个函数的地址,以前的函数通过函数名来调用,现在也可以通过指针来调用,运用类比法理解,例如以前的**int p是一个整型变量,是一个指向一个整 ...

  5. 指针进阶(指针与数组传参、数组指针与指针数组、函数指针数组、回调函数的辨析)

    指针 指针作为C语言中极具代表性的特征之一,也是C语言学习中的一大难点. 简单来说,指针我们需了解的最基础的即: 指针是一个用来存放地址的变量,地址唯一标识一块内存空间. 指针的大小是固定的4/8个字 ...

  6. 函数指针、函数指针数组,函数指针数组的指针

    数组指针 概念:数组指针是指针,只要是指针他就占4个字节: 例如: 整形指针:int *p;能够指向整形数据的指针 浮点型指针:float *p;能够指向浮点型的数据的指针 那么数组指针,同样的理解就 ...

  7. c 将数字数组转成字符串_C+|用指针指向字符串字面量、字符数组及字符指针数组...

    指针可以指向一个字符串字面量,可以指向一个字符数组,可以指向一块动态分配的内存单元: char *s1, *s2, *s3 = "abcde"; char ch[] = " ...

  8. C语言 指针数组-字符指针数组整型指针数组 char*s[3] int*a[5] 数组指针int(*p)[4]

    基本介绍 1.指针数组:由n个指向整型元素的指针而组成,里面存放指针 Int *ptr[3]; 2.地址: ptr[i]:元素地址 &ptr[i]:指针地址 图示 代码: 内存布局: 代码 # ...

  9. c语言指针数组分配内存,指针数组数组指针的分配内存及函数参数 C语言版

    最近写代码总是被基础知识卡住,十分耽误时间,今天又卡住了.所以下定决心一定要弄清楚这个问题,然后不好的是网上的资料总是解决的并不清楚,总是在纠结什么是指针数组什么是数组指针,看了<C缺陷和陷阱& ...

  10. C语言for循环实现遍历指针数组元素

    #include <stdio.h> int main() {//1.注意(每个数组名)都是这个数组首个元素的指针,下方[5]表示有5个元素,首个元素的指针就是5个元素中的首个元素的指针i ...

最新文章

  1. oracle函数,oracle编写函数
  2. 初识费用流 模板(spfa+slf优化) 餐巾计划问题
  3. flaming pear flood中文版
  4. python可以直接打印中午吗_Python print不能立即打印的解决方式
  5. 使用Async对Angular异步代码进行单元测试
  6. Java里的稀疏矩阵Sparse Array
  7. 压缩和解压文件:tar gzip bzip2 compress(转)
  8. usb2.0、usb3.0、usb3.1、type-c 接口含义与区别
  9. 3V、5V混合系统中不同电平器件接口的4种情况
  10. c语言规定学号长度,c语言第1-9章基本概念练习题ans(最全).docx
  11. 【个人笔记】OpenCV4 C++ 图像处理与视频分析 04课
  12. C语言分支循环结构1,c语言——运算符、分支结构、循环结构(示例代码)
  13. Wireshark实战分析之IP协议(二)
  14. The Beauty of DirectX 11 (3) --- constant buffer, buffered/structure buffer
  15. C语言题目:新胖子公式 (10 分)
  16. Mac上的QQ字体大小和颜色如何设置
  17. 页面中播放fla文件
  18. 从事电商Java后端一年的思考与总结
  19. 中创算力|分布式维基百科新语言版本服务上线,IPFS助力Web3.0!
  20. AcWing 1293. 夏洛克和他的女朋友

热门文章

  1. FRAM 铁电存储器
  2. 常见26种NLP任务的练手项目
  3. 布城:马来西亚新行政中心的崛起之路
  4. uniqid() 函数
  5. 支持8K播放且低延时高并发全功能的流媒体播放器如何降低直播延迟?
  6. python编写米字格的步骤_1米字格制作步骤
  7. 《外星人就在月球背面》值得一读
  8. 嵌入式软件开发常用的编辑代码工具、比较工具和测试工具的使用说明和操作步骤
  9. 【蒙古文】:传统蒙古语网页显示方法
  10. java魔塔_基于java的魔塔游戏的设计与实现论文.docx