900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > C语言:字符串数组与字符串指针数组

C语言:字符串数组与字符串指针数组

时间:2021-03-14 00:00:11

相关推荐

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结束字符串

chararr1[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"};

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。