字符指针变量与字符数组的比较
dfc6
大连理工大学第6章指针本章要点1. 理解指针与地址的概念;2. 掌握指针的定义和运算;3. 掌握指向基本类型、数组、字符串的指针的使用;4.充分理解指针和数组的等价性;预备知识1. 内存的概念内存:就是内部存储器,是由存储单元组成的。
它的特点是存储单元是线性连续的。
存储单元的最小单位是字节。
2. 地址的概念地址:为了访问内存中的某个存储单元,我们要为它编号,这种编号称为内存地址。
通过地址我们就能够访问该地址所标识的存储单元。
变量的地址:变量的地址是变量在内存中占用连续字节的首地址。
存储单元2007变量的存取方法:直接存取和间接存取。
以往对变量的访问:•定义变量: int k;编译系统根据类型为k分配内存。
•输入变量的值:scanf(“%d”,&k);&k就代表了变量k 在内存中的地址。
•通过变量名访问变量,这种操作称为直接访问:通过指针间接访问:•C提供了另一种方式,将变量k的地址存放在另一个变量处(假定为pk),通过访问pk,就可以间接地访问变量k,这种方式称为间接访问。
引入指针程序设计的优点1.有效表示复杂的数据结构。
2.方便使用字符串、数组。
3.可以得到多个返回值。
4.可以进行动态分配内存。
5.程序简洁、紧凑, 执行效率高。
6.1.1 指针的基本概念◆指针:一个变量的地址称为该变量的指针。
◆指针变量:若一个变量专用于存放另一个变量的地址(指针),则称此变量为指针变量。
若指针变量p 的值等于变量x 的地址, 则说指针变量p 指向变量x 。
1000351000p x x 的值p 的值X 的内存地址6.1 指针和指针变量指针的对象:当把变量的地址存入指针变量后,就可以说这个指针指向了该变量。
6.1.2 指针变量的定义指针变量定义的一般形式:类型标识符*标识符[例]:int *p1;float *p2;作用:定义变量为指针类型,使之专门用于存放地址。
指针所指的变量的类型指针变量名说明:(1)“*”用于定义指针变量,但指针变量名不带*。
《c++程序设计》第7章 指针
(1)取地址运算符&: 取出变量的内存首地址
(2)指针变量的赋值: 指针变量=&变量;或指针变量=指针变量;
3.指针变量的引用
指针运算符* :通过指针变量间接访问变量对应存储单元内容。
【例7.1】定义指针变量
p、p1、q,并将变量a的 地址赋给p、p1,输出a、 p、p1、*p、*p1的值。
【例7.3】指针变量的自加、自减、加n和减n运算。例程
3.指针变量的关系运算
指针变量的关系运算是指针变量值的大小比较,即 对两个指针变量内的地址进行比较,主要用于对数组元 素的判断。
【例7.4】用指针变量求一维实型数组元素和,并输出数组每个元 素的值及数组和。 例程
4.指针运算符的混合运算与优先级
指针数组
例如,指针数组的定义: int *pi[4];
表示定义了由4个整型指针元素pi[0]、pi[1]、pi[2]、pi[3]组成的整型指针数组。 char *pc[4];
表示定义了由4个字符型指针元素pc[0]、pc[1]、pc[2]、pc[3]组成的字符型指针数组。 (3)指针数组元素的引用 【例7.15】用指针数组输出字符串
3.数组元素的引用
对一维数组a[ ]而言,当p=a时: ①第i个元素地址:&a[i]= p+i=a+i。 ②第i个元素值:a[i]= *(p+i) =*(a+i)=p[i]。
一维数组的第i个元素有四种方式引用: a[i]、*(p+i) 、*(a+i)、p[i]。
用数组指针的四种方法求一维数组中的最大值的方法为: 方法一:使用*(a+i)访问a[i] 方法一:用指针变量名p代替数组名a,即用 p[i]代替a[i] 方法二:移动指针变量p++,用*p访问a[i] 方法三:使用*(p+i)访问第 i个元素a[i]
关于字符数组和字符串比较C++
关于字符数组和字符串⽐较C++char acStr[] = "aaaaa";//这个是字符数组,只含有5个字符char *pcStr = "aaaaa";//这个是字符串,含有6个字符,即5个a加⼀个结束符'\0'输出的结果 strlen()长度都是5,所以即便是字符串,最后取长度的时候,也不考虑\0: strlen()计算字符串长度,忽略结束符 \0char *p = "hello";char *q = "world";char o[] = "hello";cout<<"hello"<<strlen(p)<<endl; //5cout<<"world"<<strlen(q)<<endl; //5cout<<"o[]"<<strlen(o)<<endl; //5cout<<strlen("hello")<<endl; //51. 字符串实际要⽐字符数组多⼀个空间⽤来存放结束符 \0char *p = "hello";char *q = "world"; //⽐如world实际上存放了6个字符位, 5个字符+'\0'但是求长度,返回的值仍然是5:并不考虑结束符\0的位cout<<"hello"<<strlen(p)<<endl;cout<<"world"<<strlen(q)<<endl;2. 字符数组是不⽤存放\0位的,所以分配的字符位数只要给 strlen(p)就⾏了,不需要+1:a[0] = new char[strlen(p)];a[1] = new char[strlen(q)];⽤字符数组和字符指针变量都可实现字符串的存储和运算。
《C语言程序设计》第8章指针
10.3.3 指针变量和数组作函数参数 数组名作形参时,接收实参数组的起始地址;
作实参时,将数组的起始地址传递给形参数组。
引入指向数组的指针变量后,数组及指向数 组的指针变量作函数参数时,可有4种等价形式 (本质上是一种,即指针数据作函数参数):
(1)形参、实参都用数组名 (2)形参、实参都用指针变量 (3)形参用指针变量、实参用数组名 (4)形参用数组名、实参用指针变量
(4)指针变量的++、--与&、*的结合
对于指针变量的++、--与&、*的结合 使用,关键要注意按照运算符的优先级和 结合性进行。
例如: int a=2, *p; p=&a;
•表达式:(*p)++,按运算符的优先级,等价于 a++。其含义为:取出指针变量p所指向的内存单 元的值(即a的值),a的值加1,送回a的内存单 元,a的值变为3,p的值未发生变化,仍然指向 变量a。
程序说明:printf("%s\n",s);语句 通过指向字符串的指针变量s,整体引
用它所指向的字符串的原理:系统首先输出s 指向的第一个字符,然后使s自动加1,使 之指向下一个字符;重复上述过程,直至遇到 字符串结束标志。
main() { char string[ ]=”I love Beijing.”; printf(“%s\n”,string); }
3.数组元素的引用 数组元素的引用,既可用下标法,也可用
指针法。
10.3.2 通过指针引用数组元素 如果有“int a [10],*p=a;” ,则: (1)p+i和a+i都是数组元素a [i]的地址。
(2)*(p+i)和*(a+i)就是数组元素a [i]。 int a [3]; a [0]——*a a [1]——*(a +1) a [2]——*(a +2)
[工学]《C语言程序设计》第5章___数组、字符串、指针
5.2.2 一维数组的初始化
1、数组声明时初始化 在编译阶段进行的。这样将减少运行时间, 提高效率。 数组初始化的一般形式为: 类型符 数组名[常量表达式]={值,值…值}; 例如: int a[10]={ 0,1,2,3,4,5,6,7,8,9 }; 相当于a[0]=0; a[1]=1;... a[9]=9;
…
a[9]
#include <stdio.h> 声明有10个元素 void main() 的一维数组a {int n,i; float s=0, ave, a[10]; a[0] a[1] … a[9] for(i=0;i<10;i++) a[i] { scanf("%f",&a[i]); a[i] s=s+a[i]; } ave=s/10; for(i=0;i<10;i++) a[i] a[i] if (a[i]>ave) printf("%f ",a[i]); }
说明: ① int a[10]={0,1,2,3,4};
给前5个元素赋 值,其余赋0值 不能给数组整体 赋值,改成{1} 静态存储类型, 初值为0 可以省略数组元 素个数。 初值的个数不能 超过元素个数
② int a[10]=1;
③ static int a[3]; ④ int a[ ]={1,2,3,4,5}; ⑤ int a[5]={1,2,3,4,5,1 };
代码: for(i=0; i<N-1; i<5; i++) { p=i; for(j=i+1; i<N; j<6; j++) if(a[j]<a[p]) p=j; t=a[i]; a[i]=a[p]; a[p]=t; } 5-5.c
字符串指针与字符数组的区别
字符串指针与字符数组的区别(转载)用字符数组和字符指针变量都可实现字符串的存储和运算。
但是两者是有区别的。
在使用时应注意以下几个问题:1. 字符串指针变量本身是一个变量,用于存放字符串的首地址。
而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。
字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。
2. 对字符串指针方式char *ps="C Language";可以写为:char *ps;ps="C Language";而对数组方式:static char st[]={"C Language"};不能写为:char st[20];st={"C Language"};而只能对字符数组的各元素逐个赋值。
从以上几点可以看出字符串指针变量与字符数组在使用时的区别,同时也可看出使用指针变量更加方便。
当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。
一个错误的例子,如下:char *name;scanf("%s",name);printf("%s",name);有的编译器虽然也能通过,但这是错误的,因为是个指针,定义时指向不可用的地址。
解决这个问题有两种方法:用数组的方法或给字符针针分配内存空间的方法。
数组的方法:char name[20];scanf("%s",name);printf("%s",name);给字符针针分配内存空间的办法:char *name;name=(char*)malloc(50);//此时name已经指向一个刚刚分配的地址空间。
scanf("%s",name);printf("%s",name);但是对指针变量直接赋值是可以的。
因为C系统对指针变量赋值时要给以确定的地址。
C语言字符串替换:字符,字符串,字符数组详解
C语⾔字符串替换:字符,字符串,字符数组详解⽬录案例描述案例分析必备知识1,字符数组(1)字符数组的定义(2)字符数组的初始化2,字符串概念(1)字符串的概念(2)⽤字符初始化字符数组(3)获取字符串的长度3,字符串与指针4,字符数组与字符指针总结案例描述字符串替换是处理字符串时最常见的操作之⼀,也是学习字符串必须掌握的知识。
本案例要求通过编程实现字符串“Good moring”到“Good evening”的转换。
案例分析我们需要从字符串中被替换的位置开始,将要替换的内容逐个复制到原字符串中,直到字符串结束或者替换的字符串结束为⽌。
为了顺利完成案例,需要先学习字符数组,字符串,字符指针等基础知识。
必备知识1,字符数组字符数组是存放字符数据的数组,其中每⼀个元素都是单个字符(1)字符数组的定义字符数组定义的语法格式如下:char 数组名[常量表达式];char 数组名[常量表达式1][常量表达式2]在上述语法中,分别列举了定义⼀维字符数组和⼆维字符数组的⽅法。
⽰例代码如下:char ch[6];(2)字符数组的初始化在数组定义的同时也可以对数组中的元素进⾏赋值,这个过程称为数组的初始化,⽰例代码如下:char c[5] = {'h','e','l','l','o'};注意字符数组的初始化很简单,但要注意以下⼏点。
(1)元素个数不能多于字符数组的⼤⼩,否则编译器会出错(2)如果初始项少于数组长度,则空余元素均会被赋值为空字符(‘\0')(3)如果没有指定数组⼤⼩,则编译器会根据初始项的个数为数组分配长度(4)也可以初始化⼆维数组(和整型数组基本⼀致)2,字符串概念(1)字符串的概念字符串是由数字、字母、下划线和空格等各种字符组成的⼀串字符,是个常量,字符串的末尾都默认有⼀个'\0'作为结束符。
"abcde"" "上⾯这两⾏都是字符串,只不过第⼆个字符串中的字符都是空格字符串在各种编程语⾔中都是⾮常重要的数据类型,但是C语⾔中没有字符串的固定类型,通常⽤字符数组的形式来存储和处理字符串,这种字符数组必须以'\0'结尾。
字符串指针和字符数组,静态全局、静态局部、全局和局部变量区别,字符串常量和字符串变量,程序的内存分配
最近工作之余,发现了两个自己在C语言学习中的难点,一个是字符串指针和字符数组的区别,一个就是静态全局变量、静态局部变量、全局变量和局部变量的区别,在网上查了不少资料,收获良多,现在与大家分享,有错误的地方请大家指正!以下程序用VC++6.0调试先说说字符串指针和字符数组的区别1.相同点:/* 用字符数组实现字符串操作*/main( ){char str[]="Welcome to study C !";int i;printf("%s\n",str);for (i=0;i<=7;i++)printf("%c",str[i]); //用*(str+i)也行printf("\n");}/* 用字符指针实现字符串操作*/main(){char *str="Welcome to study C !";int i;printf("%s\n",str);for(i=0;i<=7;i++)printf("%c",*(str+i)); //用str[i]也行printf("\n");}2.不同点:a)赋值方式不同,字符数组只能对各个元素分别赋值,而字符指针只需赋给字符串的首地址就可以了。
如: char *str;str="Welcome to study C !";以下对字符数组的赋值是错误的:char str[80];str[ ]="Welcome to study C !";b)字符指针指向字符串,"hello"是一个字符串常量,与之相关联的内存空间位于内存的只读部分,如:char ch[] = "china\n";char *p;char *pp = "CHINA\n";p = ch;*(p+2) = 'h';//就是可以的*(pp+2) = 'h';//此处在编译时不会出错,在执行的时候会出错c) 函数参数列表中的以数组类型书写的形式参数,编译器把其解释为普通的指针类型,对于void func (char sa[100],int ia[20],char *p),则sa的类型为char*,而不是char[100]类型下面介绍一下字符串常量和字符串变量:1.字符串常量:a)定义:是一对双引号括起来的字符序列b)字符串包含的字符个数:不包括系统自动赋的’\0’,转义字符算1个c)所占的字节数:字符串所包含的字符个数加1d)长度:从第一个字符到第一个’\0’之间的字符个数,哪怕’\0’就在原字符串中e)无论字符串常量还是字符串变量,空字符串可以存在””,而空字符是错误的’’2.字符串变量:a)C语言本身没有设置一种类型来定义字符串变量,字符串的存储完全依赖于字符数组,但字符数组又不等于是字符串变量,例如:Char str[] = {‘a’,’b’,’c’,’\0’};是str[4],是字符串Char str[] = {‘a’,’b’,’c’};是str[3],是字符数组Char str[7] = “string!”;可能破坏其他数据b)在scanf,printf,gets,puts中的str不用写成str[10],只能写成str下面介绍下静态全局变量,静态局部变量,全局变量,局部变量的区别1.从作用域看:全局变量具有全局作用域。
c 指针和字符串常量 比对
c 指针和字符串常量比对一、概述在C语言中,指针和字符串常量是两个重要的概念。
指针是指向内存地址的变量,而字符串常量则是由字符数组表示的字符串。
本文档将介绍如何使用指针和字符串常量进行比对,以实现字符串的查找、替换和比较等功能。
二、基本概念1. 指针:指针变量存储了一个内存地址,可以通过该地址来访问该内存地址所指向的数据。
在C语言中,可以使用指针来操作内存,包括分配内存、释放内存、读取内存等操作。
2. 字符串常量:字符串常量是由字符数组表示的字符串,可以通过数组名来访问字符串中的各个字符。
在C语言中,字符串是以空字符('\0')结尾的字符数组。
三、比对方法1. 相等性比对:使用==运算符可以对两个字符串常量进行相等性比对,判断它们是否相等。
2. 包含关系比对:使用==或!=运算符可以对一个字符串常量是否包含另一个字符串常量进行比对。
可以使用循环遍历目标字符串,逐个比较字符是否在源字符串中出现。
3. 子串匹配比对:可以使用标准库函数strcmp()或strstr()等方法来进行子串匹配比对。
strcmp()函数用于比较两个字符串的大小关系,而strstr()函数则用于查找目标字符串中是否包含源字符串中的子串。
4. 指针和字符串的联合使用:可以将指针和字符串常量联合使用,通过指针来访问字符串中的各个字符,从而进行比对操作。
例如,可以使用指针来遍历一个字符串中的各个字符,并与另一个字符串进行比对。
四、示例代码以下是一个简单的示例代码,展示了如何使用指针和字符串常量进行比对操作:```c#include <stdio.h>#include <string.h>int main() {char source[] = "Hello, world!";char target[] = "world";char *pSource = source; // 使用指针来访问源字符串中的各个字符 char *pTarget = target; // 使用指针来访问目标字符串中的各个字符 int result = strcmp(pSource, pTarget); // 使用strcmp()函数进行大小关系比对if (result == 0) { // 如果相等,输出结果printf("源字符串包含目标字符串\n");} else { // 如果不相等,输出结果printf("源字符串不包含目标字符串\n");}return 0;}```五、总结通过使用指针和字符串常量,我们可以进行各种比对操作,包括相等性比对、包含关系比对、子串匹配比对等。
利用数组和指针对字符串操作的比较应用
一
c 语言中, 为了实现对字符串的操作 , 可以定义 个 字符数 组 , 可 以定 义一个 字符 串指针 , 也 虽然 它
2 字符指针和数组 的区别 与优势
2 1 赋 值方 式的 不 同意 义 .
2 1 1 数 组 方 式 赋 值 ..
们都 能实现 字符 串 的存 储 和运 算 , 它 们二 者 之 间 但 是有 区别 的 , 能混为 一谈 。 不
洪 阳
( 内蒙古 包头钢 铁职 业技 术学 院 , 内蒙古 包头 04 1) 100
摘
要 : 中通过实例阐述 了字符 串指针变量与字符数组在 处理字符 串上的 区别 , 文 利用指针数组 比二维数组 更适
合于对若干个 字符 串的处理 , 使用更加方便灵活 、 效率更高 。 关键词 : 字符数组 ; 字符指针变量 ; 指针数组
Ab t a t I h a e , e df r n e fds o i g c a a trsrn sw t t n a a lso on e sa d c a a tra - s r c :n t e p p r t i e e c so ip sn h r ce t g i s g v r be fp it r n h rc e t h i h r i i r y r lb rtd t r u h p a t e . h o n e ra sae mo es i l rd s o ig ac r i mo n f h r ce t n s a s ae e a o a e o g rc i s T ep itrar y r ut e f ip sn e t n a u t a a trs g h c r b a o a oc i r ta h t n wo—d me so a ra sa ela h y a emoe c n e in d f xb e t s o t a h f ce ce r ih r i n in lar y s w l s t e r o v n e ta e il o u e s h t e e i in is ae hg e . r n l t Ke r s: h rc e ra s s n a i l so it r ; on e ra s y wo d c a a tra r y ;t g v r e f n es p itra r y i r b a o p
C语言第7章_指针
退出
指针运算
算术运算 int *p, a[10]; p = a; p++; /*p的值增加多少?*/ 的值增加多少? 的值增加多少 指针的加减运算是以其指向的 指针的加减运算是以其指向的 类型的字节长度为单位的 类型的字节长度为单位的
6000 6001 6002 6003 6004 6005 6006
swap函数的几种错误形式(3/3) 函数的几种错误形式 3/3)
指针p没有确切地址 指针 没有确切地址 void Swap(int *p1, int *p2) { int *p; /*指针 未初始化*/ /*指针p未初始化*/ 指针p未初始化 *p = *p1; *p1 = *p2; *p2 = *p; }
退出
寻址方式
如何读写内存中的数据? 如何读写内存中的数据? 两种寻址方式 直接(寻址)访问 直接(寻址)
通过变量地址直接存取变量内容
0 ┇ 3 6 9 ┇ 3010 2000 变量 i_pointer 变量 i 变量 j 变量 k 内存用户数据区
通过变量的地址访问变量所在的 2000 存储单元
2002 2004
退出
指针运算
赋值运算 指针在使用前一定要赋值 为指针变量赋的值必须是一个地址 main() { int *p; scanf("%d",p); … }
错! 但TC下不报错 下不报错 VC下报错 下报错
main() { int a,*p=&a; scanf("%d",p); … }
退出
指针与函数
指针既然是数据类型,自然可以做函数参数和返回值 指针既然是数据类型, 的类型 指针做函数参数的经典例子: 指针做函数参数的经典例子:
《C语言程序设计II》期末复习
《C语言程序设计II》期末复习一、复习内容:⏹第1~4讲指针●指针的概念:内存单元的排列方式、地址的概念、不同数据类型内存单元的个数、存储方式不同,两种变量的存取方式,指针即是地址,NULL;●指针变量:概念和定义方法(空悬指针、空类型与空指针),指针的两个特殊运算符(*与&),指针变量作为函数参数(通过函数调用得到n个要改变的值);●指针运算:指针与整数的运算、++(--)、比较、相减;●指针与一维数组:对数组名的理解,指针与一维数组(指向数组元素的指针、引用数组元素时的指针运算、通过指针引用数组元素的几种方法、用数组名作函数参数);●指针与二维数组:理解二维数组中行指针、列指针的类型,加减1所移动的字节数,如何利用它们访问二维数组元素,用作函数参数参数时在主调函数中如何给出实参。
●通过指针引用字符串:字符串的引用方式,字符指针作函数参数,使用字符指针变量和字符数组的比较;●指向函数的指针:什么是函数指针,怎样定义和使用指向函数的指针变量,用指向函数的指针作函数参数;●返回指针值的函数:函数的返回值是一个地址,定义格式,使用;●指针数组和多重指针:什么是指针数组,指向指针数组的指针,指针数组作main函数的形参;●动态内存分配:动态内存分配的概念、必要性,与动态内存分配相关的4个函数,动态数组的建立;●有关指针的小结:指针、指向、指针变量,void *类型与NULL的比较,指针与数组的关系,各类指针类型的比较,指针的几类运算;●结构体指针:什么是结构体指针,用结构体指针访问成员的简便写法,指向结构体数组的指针,结构体变量与结构体指针作函数参数;●用指针处理链表:什么是链表,建立静态链表,建立动态链表,输出链表。
(理解链表的概念,本次考试不包含这一部分内容)。
⏹第5讲位运算和预处理指令●位运算与位运算符:位运算概念,6种基本的位运算符(&、|、^、~、<<、>>),&和^运算符的一些用法,位运算的复合赋值运算符;●位段:问题的提出,位段的概念与定义,位段的使用,注意事项;(这一部分内容不考)●预处理:概念,主要工作,功能类型,书写要求;●宏定义:不带参数的宏定义,带参数的宏定义;●“文件包含”处理:格式,作用,带<>与””的差别;●条件编译:概念,好处,几种基本格式。
c语言中不同类型的变量 数组
c语言中不同类型的变量数组
在C语言中,数组是用来存储相同类型的连续数据的变量类型。
C语言中的数组可以分为以下几种类型:1. 一维数组:一维数组是最简单的数组类型,它由相同类型的元素组成,存储在连续的内存空间中。
可以使用整数索引访问数组中的元素。
2. 二维数组:二维数组是由一维数组组成的数组。
它具有行和列的概念,可以使用行索引和列索引来访问数组中的元素。
3. 多维数组:多维数组是由两个或多个维度组成的数组。
例如,三维数组就是由三个维度组成的数组。
可以使用多个索引来访问数组中的元素。
4. 字符数组:字符数组是一种特殊的一维数组类型,用于存储字符串。
字符串实际上是由多个字符组成的字符数组,以空字符('\0')作为字符串的结束标志。
5. 指针数组:指针数组是一个数组,每个元素都是一个指针。
它可以用来存储指向不同类型变量的指针。
6. 数组指针:数组指针是一个指向数组的指针。
它可以用来访问数组中的元素,也可以用来传递数组给函数。
这些是C语言中常见的数组类型。
数组在C语言中用于存储和处理大量数据,是非常重要的数据结构之一。
C语言“字符串”
程序运行过程: How do you do?↙ How s=do,s1=you
□do? 注:□代表空格
C语言程序设计教程
第10章 字符串
12
10.1.4 字符串处理函数 C语言库函数中除了前面用到的库函数 gets()与puts()之外,还提供了一些常用的库 函数,其函数在string.h中 1.字符串拷贝函数:strcpy() 调用格式:strcpy(d_str,s_str); 功 能:将以s_str为起始地址的字符串或字 符串常量(连同‘\0’)复制到以d_str为起始地 址的、连续的内存中。 说 明:d_str在内存中所占的字节数应不 小于s_str在内存中所占的字节数。
第10章 字符串
1
第十章 字符串
10.1 字符数组与字符串 10.2 指针与字符串
2013/7/25
C语言程序设计教程
第10章 字符串
2
10.1 字符数组与字符串
10.1.1 字符数组的定义与初始化
1. 字符数组的定义 字符数组:其元素类型为字符类型的数组,其定义与前面介 绍的数组定义相同。 例如: char str[40]; 定义一个有40个元素的字符数组,每个元素相当于一个字 符变量。 char ch[5][30];
15
3.字符串比较函数strcmp()
调用格式:strcmp(str1,str2); 功能:若str1=str2,则函数返回值为0; 若str1>str2,则函数返回值为正整数; 若str1<str2,则函数值返回为负整数。 比较规则: ● 两个字符串自左至右逐个字符比较,直到出现不同字符 或遇到‘\0’为止。 ● 如字符全部相同且字符串的长度相等,则两个字符串相 等; 若出现不同字符,则遇到的第一对不同字符的ASCⅡ大者 为大,返回值为两者ASCII码值之差。 比较两字符串是否相等一般用以下形式: if (strcmp(str1,str2)==0){…}; 而 if(str1==str2){…};是错误的。
ch8-2 字符串指针、指针函数
生物医学工程学院
主讲教师:王索刚email:
suogangwang@
生物医学工程学院
C 语言程序设计生物医学工程学院
1 指针与字符串(2)
1.1 字符串的表示形式(续)字符串指针指向一个字符串char *string="I love China!";
printf("%s\n",string);C 语言程序设计
1 指针与字符串(4)
C 语言程序设计生物医学工程学院
1 指针与字符串(5)
1.2 使用字符串指针变量与字符数组的区别(续)例2 分析下面程序的运行结果{ char *a="I Love China!";运行结果:China!
printf("a=%d\tb=%d\n",a,b);
printf("a=%d\tb=%d\n",a,b);
printf("a=%d\tb=%d\n",a,b);
2 指针与函数(6)
fun(int(*pf)(),int a,int b)
{ return ((*pf)(a,b));
printf("x=%d,y=%d,z=%d\n",x,y,z);
生物医学工程学院
生物医学工程学院。
指向字符串的指针
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语言程序设计(第三版)笔记——谭浩强
第一章 概述1. C语言的特点①语言简洁、紧凑,使用方便、灵活。
共有32个关键字,9种控制语句。
②运算符丰富,公有34种运算符。
③数据结构丰富,数据类型有:整型、实型、字符型、数组、指针、结构体、共用体等。
④具有结构化的控制语句(如if…else、while、do…while、switch、for)⑤语法限制不太严格,程序设计自由度大。
⑥允许直接访问物理地址,能进行位(bit)操作,可以直接对硬件操作。
⑦生成目标代码质量高,程序执行效率高。
⑧可移植性好。
2. C语言的用途C虽不擅长科学计算和管理领域,但对操作系统和系统实用程序以及对硬件进行操作方面,C有明显的优势。
现在很多大型应用软件也用C编写。
Top of Page第二章 数据类型、运算符与表达式1. C的数据类型C的数据类型包括:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和空类型。
2.常量与变量常量其值不可改变,符号常量名通常用大写。
变量其值可以改变,变量名只能由字母、数字和下划线组成,且第一个字符必须为字母或下划线。
否则为不合法的变量名。
变量在编译时为其分配相应存储单元。
3.整型数据整型常量的表示方法:十进制不用说了,八进制以0开头,如0123,十六进制以0x开头,如0x1e。
整型变量分为:基本型(int)、短整型(short int)、长整型(long int)和无符号型。
不同机器上各类数据所占内存字节数不同,一般int型为2个字节,long型为4个字节。
4.实型数据实型常量表示形式:十进制形式由数字和小数点组成(必须有小数点),如:0.12、.123、1230.0等。
指数形式如123e3代表123×10的三次方。
实型变量分为单精度(float)和双精度(double)两类。
在一般系统中float型占4字节,7位有效数字,double型占8字节,15~16位有效数字。
5.字符型数据字符变量用单引号括起来,如'a','b'等。
C语言课件9
三、指针变量与其它类型变量的对比
共性 – 在内存中占据一定大小的存储单元 – 先定义,后使用 特殊性 – 它的内容只能是地址,而不能是数据 – 必须初始化后才能使用,否则指向不确定的存储单元 – 只能指向同一基类型的变量 – 可参与的运算:加、减一个整数,自增、自减、关系、
赋值
2013-7-31
strcpy(str,”china”); /*正确*/
char *ptr;
ptr = ”china”; 字符指针是变量,而数组名是地址常量
25/46
2013-7-31
在定义一个数组时,在编译时即分配单元,有确定地址,而 定义一个字符指针变量时,如未对它赋初值,则其所指数据 是不定的,因而使用是危险的。 例如,输入字符串时 char str[10]; scanf("%s", str); /*正确*/ char *a; scanf("%s", a); /*错误*/ 应为: char *a; char str[10]; a = str; scanf("%s", a); /*正确*/
void Swap(int x, int y) { int temp; temp = x; x = y; y = temp; }
temp
5 x 9 5 y 9 5
形 参
实 参
a 5
b 9
2013-7-31
a
b
x
y x 和 y是内部变量 17/46
单向值传递
主调函数
例9.1:编写函数实现两数的互换
被调函数
22/46
用指针变量作函数参数的程序实例
【例9.2】计算并输出最高分及相应学生的学号
字符串的指针和指向字符串的指针变量
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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
==============================
字符数组和字符指针变量都能实现字符串的存储和运算,但它们有区别:
-------------------
1.字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第一个字符的地址),绝不是把字符串放到指针变量中。
编译时为字符数组分配若干存储单元,以存放各元素的值,而对字符指针变量,只分配一个存储单元(就是首地址,一个单元4个字节)
应当在定义指针变量后,及时指定其指向。
-------------------
5.指针变量的值是可以改变的,而数组名代表一个固定的值(数组首元素的地址),不能改变。
-----------------
6.字符数组中各元素的值是可以改变的(可以对它们再赋值),但字符指针变量指向的字符串常量中的内容是不可以被取代的(不能对它们再赋值)。
----------------
7.引用数组元素
----------
8.用指针变量指向一个格式字符串,可以用它代替print=========
日期:2017-02-21
----------------
2.赋值方式。可以对字符指针变量赋值,但不能对数组名赋值。
--------------------
3.初始化的含义不同
数组可以在定义时对各元素赋初值,但不能用赋值店名 对字符数组中的全部元素整体赋值。
---------------------
4.存储单元的内容