C语⾔:字符串数组与字符串指针数组
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;
c语言如何创建字符串数组}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"};
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论