指向字符串的指针变量
- 格式:ppt
- 大小:89.00 KB
- 文档页数:17
为什么字符串可以赋值给字符指针变量?⼀、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虽然也有地址,但是这与指针是不⼀样的,指针的值是地址,⽽数组的值虽然也是地址,但是却是⼀个常量,所以不能给常量赋值。
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.变量的指针和指向变量的指针变量读起来很拗口,说白了就是变量的地址和用来存放变量地址的地址变量。
因为一个变量在编译的时候系统要为它分配一个地址,假如再用一个变量来存放这个地址,那么这个变量就叫做指向变量的指针变量,也就是用来存放变量地址的这么一个变量。
所谓"指向"就是指存放××的地址,如指向变量的指针变量,"指向"就是指用来存放变量的地址,再如指向数组的指针变量,"指向"就是指存放数组的地址。
只要理解了这个,指针也就不难了。
另外,还有指向字符串的指针变量,指向函数的指针变量,指向指针的指针变量等。
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)指向多维数组的指针和指针变量以二维数组为居多。
计算机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、无论哪种循环语句,都必须给出循环结束条件。