指向字符串的指针变量
(完整版)C语言考试题库之判断题(2)
68、指针变量,只能作为函数的形参,不可以作函数的实参(1分)
正确
69、文件指针用于指向文件,文件只有被打开后才有对应的文件指针。(1分)
正确
70、C语言是一种非结构化程序设计语言。(1分)
错误
71、在C语言程序中,凡是没有出现存储类说明符的变量都是自动类的。(1分)
正确
72、在switch语句中,多个case可以共用一组执行语句。(1分)
错误
15、do-while循环的while后的分号可以省略。(1分)
错误
16、用字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志'\0'。
正确
17、C语言函数返回类型的默认定义类型是void(1分)
错误
18、可以用一个指针变量指向一个函数,然后通过该指针变量调用此函数(1分)
正确
87、枚举类型中的元素都具有一个整型值。(1分)
正确
88、文件是否打开是可以判断的。(1分)
正确
89、C语言的应用比较广泛,不仅可用来编写应用软件,而且可用来编写系统软件。(1分)
正确
90、C语言程序中,出现非法字符时会发出错误信息。(1分)
正确
91、C语言的书写格式不会影响程序的可读性。(1分)
错误
错误
131、字符串在内存中的起始地址称为字符串的指针,可以定义一个字符指针变量指向一个字符串(1分)
正确
错误
107、double型变量在内存中占的字节数比int型变量在内存中占的字节数多。(1分)
正确
108、循环体如包括有一个以上的语句,则必须用{}括起来,组成复合语句。(1分)
正确
109、C语言标准输出操作中,putchar()函数可以输出显示一个字符串。(1分)
为什么字符串可以赋值给字符指针变量?
为什么字符串可以赋值给字符指针变量?⼀、C语⾔中,为什么字符串可以赋值给字符指针变量?char *p;a='5';p=&a; //显然是正确的,p="abcd"; //但为什么也可以这样赋值??问:⼀直理解不了为什么可以将字串常量赋值给字符指针变量,请各位指点!答:双引号做了3件事:1.申请了空间(在常量区),存放了字符串2. 在字符串尾加上了'/0'3.返回地址你这⾥就是返回的地址赋值给了 p⼆、char *p = “hello”; 表达式为什么可以,⽽把p换成数组,然后再赋值就不⾏了解释:别说换成数组,就是 char *pch1 = 'h'; 都是不可以的,因为双引号做了3件事,别的都不会做。
字符串常量"hello"出现在⼀个表达式中时,"hello"表达式使⽤的值就是这些字符所存储的地址(在常量区),⽽不是这些字符本⾝。
所以,可以把字符串赋值给指向字符的指针p,⽽不能把字符串赋值给⼀个字符数组。
char a[10] = “hello”; //这样可以,这种情况是c语⾔初始化所⽀持的如果写成char a[10]然后 a = “hello” 这样就错误了。
同样是a数组,char a[10] = “hello”;这种是数组的初始化,和a[0] = ‘h’ a[1] = ‘e’…是⼀个道理但是换成char a [10],然后a = “hello”就不⾏了。
“hello”赋值的值是⼀个地址,⽽a虽然也有地址,但是这与指针是不⼀样的,指针的值是地址,⽽数组的值虽然也是地址,但是却是⼀个常量,所以不能给常量赋值。
指向字符串的指针和二级指针
pp
Li
第8章
指 针
8.2指向字符串的指针变量
1. 让一个字符指针变量指向字符串的方法 1)在指针变量初始化时。格式是: char *<指针变量名>=<字符串常量> 例如:char *ptr=“beijing is a beautiful city” 2)在程序中直接将字符串常量赋给一个字符型指针变 量.格式是: char *<指针变量名> <指针变量名>=<字符串常量> 例如:char *p; p=“it is a very good”;
int week; printf("Enter week No.: "); 利用字符指针数组处理长度不等的字符串,可节省 存储空间。 scanf("%d",&week); if (week>=0 && week<7)
printf("week No.%d —— %s\n",week,weekname[week]);
8.2 指针与数组
8.2.2 指向字符串的指针变量 【例8.1】分析下列程序的两条puts()语句,分别输出 什么?
#include “stdio.h” main() {
char *ptr=“beijing is a beautiful city”; puts(ptr); ptr=“it is very good”; puts(ptr);
}
8.2 指针与数组
8.2.4 多级指针 二级指针变量定义的一般形式: 1. 二级指针变量的定义 数据类型标识符 **指针变量名; 如果一个指针的目标变量是一个指针类型 其中“**指针变量名”相当于*(*指针变量名), 变量,则此指针为指向指针的指针变量,也称 在括号中定义了一个指针变量,括号外的“*”,说明 为多级指针变量。 指针变量(即二级指针)的目标变量是一个指针类型
指向字符串的指针
cout<<"字符数组的长度为:"<<strlen(ch)<<endl;
Character string(p,ch);
string.display();
string.display1();
return 0;
}
/*
在VC++6.0中的输出结果为:
/*
功能:测试字符串指针的应用
注意字符数组与字符串指针的区别:
字符数组名是个静态的地址,指向数组的首地址(也就是第一个元素的地址)
字符串指针则是动态的,也指向字符串的首地址
char * p;
p = "Hello" //实际上就是将字符串Hello的首地址赋给指针变量P;
在输出时:cout<<p<<endl;//p代表整个字符串
cout<<&p<<endl; //输出为:指针变量p的地址
cout<<*p<<endl; //输出为:H
cout<<p+1<<endl; //输出为:ello,p+1 为从第二个字符的地址
cout<<&(*p)<<endl; //输出为Hello &(*p)等价于p
{
this->p = p;
for(int i=0;i<6;i++)
ch[i] = ch1[i];
}
void display()
{
C语言程序设计(判断题专项练习)及答案
计算机C语言(判断题专项练习)及答案一、基础知识(每小题1 分,共 10分)()1、程序调试就是找出并改正c源程序中的语法错误。
()2、一个变量的数据类型被强制转换后,它将保持被强制转换后的数据类型。
()3、在标准c语言中,共用体变量中的各成员是共同占用一块存储空间()4、赋值运算符的结合方向为自右向左。
()5、c语言的标识符由字母、数字和下划线组成,其中第一个字符必须是字母或下划线。
()6、在c程序中, aph和Aph 是两个相同的变量()7、计算机语言(computer language)是人与计算机之间通讯的语言。
()8、在c语言中,当一个逻辑表达式的值为"假"时,该表达式的值一定是 0()9、在c程序中,abc与ABC是两个相同的变量。
()10、c语言中sizeof 是函数,而不是运算符。
二、控制结构(每小题1 分,共 10分)()1、if 语句后面的表达式只能是关系表达式()2、在switch语句中,可以根据需要使用或不使用break语句。
()3、在标准c中,逻辑表达式中只允许出现逻辑型数据。
()4、逻辑表达式的值只能为1或0。
()5、c程序中if语句可以单独存在。
()6、省略else的if语句的一般形式如下,若表达式的值为"真",则执行语句1;否则,就什么也不做。
if (表达式) 语句1()7、在if语句中,必须出现else。
()8、内层break语句可以终止嵌套的switch,使最外层的switch结束。
()9、switch语句中的default必须出现在所有case之后。
()10、switch语句中,每一个case的冒号后面都必须至少跟有一条语句。
三、循环结构(每小题1 分,共 10分)()1、for循环的三个表达式可以任意省略,while,do-while也是如此。
()2、选择结构( if 语句)和循环结构都可以使用嵌套形式()3、在循环过程中,使用break语句和continue语句的作用是一样的()4、无论哪种循环语句,都必须给出循环结束条件。
字符串字符指针
gets(st1);
/*输入字符串st1*/
scanf("%s",st2); /*输入字符T串hists2*i/ s a book
puts(st1);
/*输出字符t串hists1*/
puts(st2);
/*输出字符串st2*/
}
从上面的运行结果,可以看出当输入的字符串中含有空格时, 使用gets()和scanf()输出的不同。
2
1.1 指向字符串的指针
字符指针变量初始化的方法有以下两种形式: (1)在定义指针变量的同时进行初始化 例如: char *sp={“Welcome”}; 或
char *sp="Welcome"; 需要特别注意的是:对字符指针初始化就是将字符串的首地 址赋值给指针变量,而不是将字符串本身复制到指针中。 (2)使用赋值语句来初始化指针变量 可以将需要处理的字符串直接赋值给已经定义好的字符指针 变量,例如: char *s; … s="Welcome";
10
1.3 字符串处理函数
例5-21 字符串的输入示例 #include "stdio.h" void main()
程序运行结果是: input string:
{char st1[20],st2[20];
This is a book <回车>
printf("input string:\n"); this is a book <回车>
11
1.3 字符串处理函数
3.字符串连接函数s,str2)
功能:把字符数组str2中的字符串连接到字符数组str1 中
字符串的后面,并删去字符串1后的串标志“\0”。本函数返
c语言字符指针赋值
c语言字符指针赋值C语言中,字符指针是一种特殊的指针类型,用于表示指向字符(字节)的指针。
字符指针在C语言中有着广泛的应用,特别是在处理字符串时非常常见。
在C语言中,字符串实际上是以字符数组的形式存储的,而字符指针则是指向字符数组的第一个元素的地址。
通过字符指针,我们可以方便地操作字符串,例如获取字符串的长度、复制字符串、连接字符串等。
要赋值一个字符指针,我们需要将一个地址值赋给指针变量。
这个地址值可以是一个字符数组的第一个元素的地址,也可以是一个字符串常量(字符数组)的地址。
示例如下:```c#include <stdio.h>int main() {char arr[] = "Hello World"; //定义一个字符数组并初始化char* ptr = arr; //将字符数组的第一个元素的地址赋给指针变量printf("arr: %s\n", arr); //输出字符数组printf("ptr: %s\n", ptr); //输出指针变量指向的字符串return 0;}```在上面的示例中,我们定义了一个字符数组`arr`,并将其初始化为字符串常量"Hello World"。
然后,我们将`arr`的第一个元素的地址赋给了字符指针`ptr`。
最后,通过`printf`函数分别输出了`arr`和`ptr`所指向的字符串。
除了将字符数组赋给字符指针外,我们还可以通过指针运算来改变指针的指向。
例如,通过递增字符指针的方式可以遍历字符串中的每个字符。
示例如下:```c#include <stdio.h>int main() {char str[] = "Hello";char* ptr = str;while (*ptr != '\0') { //通过指针运算遍历字符串printf("%c ", *ptr);ptr++;}return 0;}```在上面的示例中,我们定义了一个字符数组`str`,并将其初始化为字符串常量"Hello"。
c 有string类型的基础知识选择题
c 有string类型的基础知识选择题全文共四篇示例,供读者参考第一篇示例:在C语言中,虽然没有内置的string类型,但我们可以使用字符数组来表示字符串。
下面是一些关于C语言中string类型基础知识的选择题:1. 在C语言中表示字符串的最常见方法是使用什么数据类型?A. intB. floatC. charD. double答案:C2. 下面哪种声明方式可以正确定义一个字符数组来存储字符串"Hello"?A. char str[6] = "Hello";B. char str[5] = "Hello";C. char str[] = "Hello";D. char str[5] = {'H', 'e', 'l', 'l', 'o'};4. 下面哪个函数用于计算字符串的长度?A. strlen()B. strcpy()C. strcat()D. strcmp()9. 字符串"Hello World"的长度是多少?A. 10B. 11C. 12D. 13第二篇示例:1. 在C语言中,字符串类型是以哪种方式进行表示的?A. 数组B. 结构体C. 指针D. 链表2. 下列哪种数据类型用于表示字符串的结尾?A. charB. intC. floatD. null4. 下列哪个函数用于比较两个字符串是否相等?A. strlen()B. strcpy()C. strcmp()D. strcat()11. 在C语言中,如何声明一个字符串变量?A. char str;B. char *str[];C. char str[];D. char *str;12. 下列哪个语句用于初始化一个字符串变量?A. str = "hello";B. strcpy(str, "hello");C. str = {'h', 'e', 'l', 'l', 'o', '\0'};D. str = "hello\0";15. 在C语言中,如何将一个整数转换为字符串?A. itoa()B. atoi()C. atof()D. sprintf()答案:1. A2. D3. D4. C5. A6. B7. D8. D9. D10. A11. D12. B13. A14. A15. D希望以上选择题能帮助大家更好地了解C语言中关于字符串类型的基础知识。
指针 与字符串
⑹用指针变量指向一个格式字符串,可以用它代替 printf函数的格式字符串。
如:int a; char *format; format=“a=%d\n”; 则:printf(format,a);相当于printf(“a=%d\n”,a);
注意:区别 int *p[2] 、int (*p)[2] 的含意。
二、定义多字符串的方法 1.用二维数组定义多字符串 例如:
char state[4][9]={“china”,”american”,”japan”,”canada”};
2.用字符指针数组定义多个字符串
例如:
char *state[4][]={“china”,”american”,”japan”,”canada”};
C语言程序设计
指针与字符串
字符串指针:字符串的首地址。 字符指针变量:指向字符串的指针变量。 字符指针变量定义的一般形式:
char *指针变量名;
字符指针变量定义时可以赋初值。
例如:char *strp=“Hello!”; 定义了一个指向字符串的指针变量,并将字符 串的首地址赋值给strp指针变量,即:使指针变量 strp指向字符串首地址。
main() /*与用行指针解决上述问题比较*/
{ char name[][80]={"aaa","bbb","ccc","ddd","eee"}; char (*pname)[80]=name, i ; for(i=0;i<5;i++)puts(pname[i]);
}
方法⑵:用指针数组指向字符串常量。
指向字符串的指针
10.4符串的指针指向字符串的针指变量10.4.1 字符串的表示形式在C语言中,可以用两种方法访问一个字符串。
1) 用字符数组存放一个字符串,然后输出该字符串。
【例10.24】main(){char string[]=”I love China!”;printf("%s\n",string);}说明:和前面介绍的数组属性一样,string是数组名,它代表字符数组的首地址。
2)用字符串指针指向一个字符串。
【例10.25】main(){char *string=”I love China!”;printf("%s\n",string);}字符串指针变量的定义说明与指向字符变量的指针变量说明是相同的。
只能按对指针变量的赋值不同来区别。
对指向字符变量的指针变量应赋予该字符变量的地址。
如: char c,*p=&c;表示p是一个指向字符变量c的指针变量。
而: char *s="C Language";则表示s是一个指向字符串的指针变量。
把字符串的首地址赋予s。
上例中,首先定义string是一个字符指针变量,然后把字符串的首地址赋予string(应写出整个字符串,以便编译系统把该串装入连续的一块内存单元),并把首地址送入string。
程序中的:char *ps="C Language";等效于:char *ps;ps="C Language";【例10.26】输出字符串中n个字符后的所有字符。
main(){char *ps="this is a book";int n=10;ps=ps+n;printf("%s\n",ps);}运行结果为:book在程序中对ps初始化时,即把字符串首地址赋予ps,当ps= ps+10之后,ps指向字符“b”,因此输出为"book"。
c语言字符串指针初始化
c语言字符串指针初始化C语言字符串指针初始化为标题在C语言中,字符串是一种常见的数据类型,用于存储和操作文本数据。
字符串指针则是指向字符串的指针变量,可以用于对字符串进行操作和处理。
本文将以C语言字符串指针初始化为标题为主题,探讨字符串指针的初始化和使用方法。
## 1. 概述在C语言中,字符串指针的初始化可以通过多种方式实现。
常见的方式有直接赋值、使用strcpy函数和通过字符数组的地址进行初始化等。
下面将详细介绍这些初始化方法。
## 2. 直接赋值字符串指针的直接赋值是一种简单且常用的初始化方式。
通过将字符串的首地址赋值给指针变量,即可完成指针的初始化。
具体实现如下:```cchar *str = "Hello, world!";```在上述代码中,字符串常量"Hello, world!"的首地址被赋值给了指针变量str。
这样,str就指向了该字符串。
需要注意的是,使用直接赋值方式时,不能对字符串进行修改,否则会导致程序崩溃。
## 3. 使用strcpy函数另一种常见的字符串指针初始化方式是使用strcpy函数。
该函数用于将一个字符串复制到另一个字符串中。
通过将目标字符串的地址作为参数传递给strcpy函数,即可将字符串的内容复制到指针变量所指向的位置。
具体示例如下:```cchar str[20];strcpy(str, "Hello, world!");```在上述代码中,首先定义了一个大小为20的字符数组str,然后使用strcpy函数将字符串"Hello, world!"复制到了str中。
这样,str 就指向了复制后的字符串。
## 4. 通过字符数组的地址进行初始化除了上述两种常用的初始化方式,还可以通过字符数组的地址来初始化字符串指针。
具体方法是将字符数组的名称直接赋值给指针变量,即可使指针指向字符数组的首地址。
字符串的指针和指向字符串的指针变量
10.4字符串的指针和指向字符串的指针在C语言中,既可以用字符数组表示字符串,也可用字符指针变量来表示;引用时,既可以逐个字符引用,也可以整体引用。
字符串在内存中的起始地址称为字符串的指针,可以定义一个字符指针变量指向一个字符串。
1.定义字符指针变量★char *ps1;ps1="form one";char *ps1="form one";★char str[ ]= "form one", *ps1;★ps1=str;注意:字符指针变量ps1中,仅存储串常量的地址,而串常量的内容(即字符串本身),是存储在由系统自动开辟的内存块中,并在串尾添加一个结束标志’\0’。
2. 引用1)逐个引用main(){ char *string="I am fine.";for(; *string!=’\0’; string++)printf("%c", *string);printf("\n");}2) 整体引用main(){ char *string="I am fine.";printf("%s\n",string);}程序说明:printf("%s\n",string);语句通过指向字符串的指针变量string,整体引用它所指向的字符串的原理:系统首先输出string指向的第一个字符,然后使string自动加1,使之指向下一个字符;重复上述过程,直至遇到字符串结束标志。
注意:其它类型的数组,是不能用数组名来一次性输出它的全部元素的,只能逐个元素输出。
3.字符指针变量与字符数组之比较虽然用字符指针变量和字符数组都能实现字符串的存储和处理,但二者有区别.(1)存储内容不同。
字符指针变量中存储的是字符串的首地址,而字符数组中存储的是字符串本身(数组的每个元素存放一个字符)。
变量的指针和指向变量的指针变量
1.变量的指针和指向变量的指针变量读起来很拗口,说白了就是变量的地址和用来存放变量地址的地址变量。
因为一个变量在编译的时候系统要为它分配一个地址,假如再用一个变量来存放这个地址,那么这个变量就叫做指向变量的指针变量,也就是用来存放变量地址的这么一个变量。
所谓"指向"就是指存放××的地址,如指向变量的指针变量,"指向"就是指用来存放变量的地址,再如指向数组的指针变量,"指向"就是指存放数组的地址。
只要理解了这个,指针也就不难了。
另外,还有指向字符串的指针变量,指向函数的指针变量,指向指针的指针变量等。
1) 指针变量的定义形式:类型标识符*标识符如:int *pointer;要注意两点:*表示pointer是个指针变量,在用这个变量的时候不能写成*pointer,*pointer 是pointer指向的变量。
一个指针变量只能指向同一个类型的变量。
如上面pointer只能指向int型变量。
2)指针变量的引用两个有关的运算符:& 取地址运算符&a 就代表变量a的地址* 指针运算符*a就代表变量a的值2.数组的指针和指向数组的指针变量数组的指针指数组的起始地址,数组元素的指针指数组元素的地址。
1)指向数组元素的指针变量的定义与赋值定义和指向变量的指针变量定义相同,c规定数组名代表数组的首地址,即第一个数组元素地址。
2)通过指针引用数组元素我们通常引用数组元素的形式是a,如果用指针可以这样引用,*(a+i),或定义一个指针变量p,将数组a的首地址赋给p,p=a;然后用*(p+i)引用。
注意:指针变量p指向数组a首地址,则p++指向数组a的下一元素地址,即a[1]的地址。
3)数组名作函数参数形参数组和实参数组之间并不是值传递,而是共用同一段地址,所以在函数调用过程中如果形参的值发生变化,则实参的值也跟着变化。
4)指向多维数组的指针和指针变量以二维数组为居多。
字符串和字符串指针变量(2版(
strlwr函数和strupr函数
strlwr函数的作用是将字符串中大写字母换成小写字母。 其一般形式为:
strlwr (字符串)
strupr函数的作用是将字符串中小写字母换成大写字母。 其一般形式为:
strupr (字符串)
6.3.3 指向字符串的指针变量
可以定义一个指向字符的指针变量来指向存放字符 串的首地址,这种指针变量就称为指向字符串的指 针变量。
例题2:
编写程序代码统计用户从键盘上输入一行字符中, 字母,数字,空格和其他字符的个数。
例如: 键盘输入 Monday. 则显示字母有9个,数字2个,空格4个,其他字符1个 #include <stdio.h>
void main()
{ char c[100]; int i,zm=0,sz=0,kg=0,qt=0;
字符变量
字符变量是用类型符char定义的变量。一个字符变 量只能存储一个ASCII字符。
例如: 正确的代码: 错误的代码: char c; c=„?‟; c=„?!‟; c=“abc”;
2.字符串常量
由多个字符组成的数据称为字符串常量(以后简称字 符串),字符串常量的两边必须用双引号包含起来。
例如: “this is a string.”
操作字符串的函数
下面介绍字符串处理函数,使用这些有特殊功能的函 数时,ANSI C标准要求必须包含头文件”string.h”, 即程序的开头要有
#include “string.h”
strcat函数
用于连接两个字符数组中的字符串。即把字符串2接到字符 串1的后,并将结果保存在字符数组1。
strcat(字符数组1,字符数组2)
指向字符串的指针变量
}
***** **** *** ** *
用字符指针实现
#include<stdio.h>
main()
{ char *p=“*****”;
for(;*p;)
printf(“%s\n”,p++);
}
思考:
编写程序输出以下图形:
*
**
***
****
*****
#include<stdio.h>
main()
{ while(*q!=‘\0’)
{ *p=*q;
p++;
q++;
}
}
典型例题2:编写程序输出以下图形
用字符数组实现
#include<stdio.h>
main()
{ char s[ ]=“*****”;
int i;
for (i=0;s[i]!=‘\0’;i++)
printf(“%s\n”,s+i);
{ while(*(a++)!=‘\0’);
while(*(a-1)<b)
*(a--)=*(a-1);
*(a--)=b;
}
运行结果: 976531
为了防止信息被别人轻易窃取,需要把电
码明文通过加密方式变换成密文。变换规 则如下:小写z变为a,其它字母变换为该 字母ASCII码顺序后1位的字母,比如Q变 换为P.
char *p中的 p是一个指针,其初值指向一个字符 串常量,它存放的是该字符串的首地址(并不是该字 符串的内容),之后它还可以被修改指向其他字符串, 那么它就改为指向其它存储区,值随之发生变化。
计算机二级C语言字符串的指针以及指向字符串的指针变量
计算机二级C语言字符串的指针以及指向字符串的指针变量计算机二级C语言字符串的指针以及指向字符串的指针变量1.用指针方法实现一个字符串的存储和运算如:char * strp=″china″;此处定义了一个字符指针变量strp,变量中存放的是字符串第一个字符的地址。
C语言对字符串常量是按字符数组处理的,它实际上在内存开辟了一个字符数组用来存放字符串变量,并把字符串首地址赋给字符指针变量strp。
在输出时用printf(″%s\n″,strp);通过字符数组名或字符指针变量可以输出一个字符串。
而对一个数值型数组,是不能企图用数组名输出它的全部元素的。
2.字符指针变量与字符数组虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的`,不应混为一谈,主要有以下几点:(1)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串的首地址),决不是将字符串放到字符指针变量中。
(2)对字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值。
Char str[14];str=″I love China!″;而对字符指针变量,可以采用下面方法赋值:char *a;a=″I love China!″;但注意赋给a的不是字符,而是字符串的首地址。
(3)赋初值时,对以下的变量定义和赋初值:char *a=″I love China!″;等价于:char *a;a=″I love China!″;而对数组初始化时:static char str[14]={″I love China!″};不能等价于char str[14];str[]={″I love China!″};即数组可以在变量定义时整体赋初值,但不能在赋值语句中整体赋值。
(4)在定义一个数组时,在编译时即已分配内存单元,有确定的地址。
而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个地址值,就是说,该指针变量可以指向一个字符型数据,但如果未对它赋予一个地址值,这时该指针变量并未具体指向哪一个字符数据。
CC++字符串指针指向字符串的指针
C、C++字符串指针(指向字符串的指针)C语言中没有特定的字符串类型,我们通常是将字符串放在一个字符数组中,这里我们来演示一下:#include <stdio.h>#include <string.h>#include <iostream>int main(){char str[] = "hello world !";int len = strlen(str), i;〃直接输出字符串printf("%s\n", str);〃每次输出一个字符for(i=0; i<len; i++){printf("%c", str[i]);)printf("\n");return 0;)运行结果:hello world !hello world !字符数组归根结底还是一个数组,上节讲到的关于指针和数组的规则同样也适用于字符数组。
更改上面的代码,使用指针的方式来输出字符串:#include <stdio.h>#include <string>#include <iostream>int main() {char str[] = "hello world !";char *pstr = str;int len = strlen(str), i;〃使用*(pstr+i)for (i = 0; i<len; i++) {printf("%c", *(pstr + i));)printf("\n");〃使用pstr[i]for (i = 0; i<len; i++) {printf("%c", pstr[i]);)printf("\n");〃使用*(str+i)for (i = 0; i<len; i++) {printf("%c", *(str + i));)printf("\n");system("pause");return 0;)运行结果:hello world !hello world !hello world!除了字符数组,C语言还支持另外一种表示字符串的方法,就是直接使用一个指针指向字符串,例如:char *str = 11 11 ,3a l sll hello world !;或者:char *str;str = " hello world !";字符串中的所有字符在内存中是连续排列的,str指向的是字符串的第0个字符;我们通常将第0个字符的地址称为字符串的首地址。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
❖}
❖ encrypt(char *s)
❖ { for(; _*s_!=‘_\0’ ;s++)
❖
if(*s==‘z’)
❖
_ _ _*s=_‘a’_ _ _ _ _
❖
else
❖
_ _*_s=*_s+_1; _ _ _ _
❖}
❖
作业:
❖ 练习册p121-124
❖
void strcpy(char *p,char *q)
❖
{ while(*q!=‘\0’)
❖
{ *p=*q;
❖
p++;
❖
q++;
❖
}
❖
}
典型例题2:编写程序输出以下图形
❖ 用字符数组实现
❖
#include<stdio.h>
❖
main()
❖
{ char s[ ]=“*****”;
❖
int i;
❖
4、要处理字符串中的单个字符,则通过数组下标或者字符
指针的间接访问。
但是两个定义的差别很大:
char ch[ ] 定义一个数组,ch是一个足以存放字 符串和空字符‘\0’的一维数组的名字,也是首地址, 它是一个常量,一旦定义,即使该数组中存储的字符 串发生改变,它也不发生变化,总是指向同一存储区。
例如: char *p=“abc” ; printf(“%c\n”,*p);
p
a
p+1
b
p+2
c
printf(“%s\n”,p);
\0
printf(“%s” ,p+1);
输出结果为:
a
abc
注意:
bc
1、赋值时,字符串的结束标志‘\0’是系统自动增加的。 2、字符串在内存中连续存放。
3、在输出/输入字符串时,如果只指出数组名或者指针变量, 则是处理整个数组。
for (i=0;s[i]!=‘\0’;i++)
❖
printf(“%s\n”,s+i);
❖
}
***** **** *** ** *
用字符指针实现
❖
#include<stdio.h>
❖
main()
❖
{ char *p=“*****”;
❖
for(;*p;)
❖
printf(“%s\n”,p++);
❖
}
思考:
❖ main()
❖ { char line[MAXLINE];
❖ printf(“Input the string:”); ❖ _ge_ts(l_ine_); _ _ _ _ _
❖ encrypt(line);
❖ printf(“%s%s\n”,”After being encrypted:”,line);
❖ 编写程序输出以下图形:
❖
*
❖
**
❖
***
❖
****
❖
*****
❖
#include<stdio.h>
❖
main()
❖
{ char *p=“*****”,*q;ቤተ መጻሕፍቲ ባይዱ
❖
for(q=p+4;q>=p;q--)
❖
printf(“%s\n”,q);
❖
}
学生练习:
❖
#include<stdio.h>
❖
#include<string.h>
•字符串的两种表示形式:
1、字符数组的方式实现: char ch[ ]=“this is a book!” ;
使用数组的下标可以逐个访问字符串中 的字符,还可以用%s格式整体输入输出 例如:
for(i=0;ch[i]!=‘\0’;i++) printf(“%c”,ch[i]);
printf (“%s\n” ,ch);
❖}
运行结果: 976531
为了防止信息被别人轻易窃取,需要把电
码明文通过加密方式变换成密文。变换规 则如下:小写z变为a,其它字母变换为该 字母ASCII码顺序后1位的字母,比如Q变
换为P.
❖ #include<stdio.h>
❖ #include<string.h>
❖ #define MAXLINE 100
char *p中的 p是一个指针,其初值指向一个字符 串常量,它存放的是该字符串的首地址(并不是该字 符串的内容),之后它还可以被修改指向其他字符串, 那么它就改为指向其它存储区,值随之发生变化。
例:若字符数组mess和指向字符串的指针变量p的内 容发生了变化,测试mess和p的值是否发生变化。
❖ #include<stdio.h> ❖ char mess[]=“I am a student”; ❖ char *p=“China”; ❖ int i; ❖ main() ❖ { printf(“%d,%d\n”,mess,p); ❖ p=“Fuzhou”; ❖ i=0; ❖ while(mess[i]!=‘\0’) ❖ { mess[i]=mess[i+1]; i++;} ❖ printf(“%d,%d\n”,mess,p); ❖}
❖
}
❖ main()
❖ { char s[]=“97531”,c;
❖ c=‘6’;
❖ fun(s,c);
❖ puts(c);
❖}
❖ fun(char *a,char b)
❖ { while(*(a++)!=‘\0’);
❖ while(*(a-1)<b)
❖
*(a--)=*(a-1);
❖ *(a--)=b;
❖ 2、字符指针的方式实现: char *p=“this is a book!” ;
使用字符指针的间接访问运算符可以逐个 访问字符串中的字符,也可以使用%s格式 对字符串整体输入输出。 例如: for(;*p!=‘\0’;p++)
printf(“%c”,*p);
printf (“%s\n” ,p);
❖
main()
❖
{ int i=0,n=0;
❖
char s[80],*p;
❖
p=s;
❖
strcpy(p,”It is a book.”);
❖
for(;*p!=‘\0’;p++)
❖
if(*p==‘ ’) i=0;
❖
else if(i==0)
运行结果:n=4
❖
{n++;i=1;}
❖
printf(“n=%d\n”,n);
运行结果为: 404,421 404,434
典型例题1:编写字符串复制函数strcpy(s1,s2)
❖ 用数组实现
❖
❖ void strcpy(char s1[ ],char s2[ ])
❖
{ int i=0;
❖
while(s2[i]!=‘\0’)
❖
{ s1[i]=s2[i];
❖
i++;
❖
}
❖
}
用指针实现