字符串指针
字符串与指针

5· 指针做函数的参数 5
[本段任务] 掌握用指针作为函数参数编程的方法。 在本章第三节3· 函数调用时参数传递方式这一段,我们 2 讨论过函数的参数呈现有传值方式和传址方式两种。并 介绍了使用数组名做实参,用与实参数组同类型的数组 作形参的方法实现传址方式。通过指针一节的学习,我 们明白了,这样的传址方式其实就是用指针作函数的参 数。在程序当中,凡是需要将一个以上的数据从被调函 数传到主调函数里,必须将函数的参数设为指针变量。 这样设计的目的,是使主调函数和被调函数对应的形、实 参都指向同一个变量,当主调函数实参所指的变量发生 任何改变,或者被调函数对应的形参所指的变量发生任 何改变,本质上都是同一个变量发生的改变。
例4_5_7 已知一个不透明的布袋里装有红、蓝、 黄、绿、紫色的、同样大小的圆球各一个,现 从中一次抓出两个,问可能抓到的是什么颜色 的球?用指针数组类型数据解之。 分析:用一重循环从1~5表示抓到的红、蓝、黄、 绿、紫色的一个球,用另一重循环从1~5表示 抓到的红、蓝、黄、绿、紫色的第二个球。由 于每次抓到的球不可能同色,只要判断两重循 环不能取同一个值,所得的结果为所求。只是 所用的数据类型为指针数组,指针数组的元素 为字符串。
5· 2 用字符串指针访问字符串 4·
输出的一般形式是: printf(“%s”,字符串指针变量名); 输 出 还 可 以 使 用 puts, 输 入 可 以 使 用 gets 或 者 scanf。 %s是字符串所用的格式符,它可以对字符串进 行整体输入、输出,而不必采用循环逐个字符 访问。系统首先访问string所指向的那个字符, 然后使指针string自动加1,指向下一个字符, 然后输出下一个字符,……直到遇到字符串结 束标准’\0’为止。
[ 小结 ]
指针与字符串

cout<<strlen(p);
strcpy(s,p); //把右边地址的字符串复制到左边地址的位置
cout<<s;
cin>>s;
cout<<s;
p=s;
cin>>p;
cout<<p;
例题:
字符串比较
int strcmp(const char *p1,const char *p2)
delete 注销指定地址处动态分配的空间。
注意:
程序结束之前,一定要用delete注销所有用new分配的空间,否则会造成内存泄露。好的编程习惯是,delete过后,把指针p改为空指针null或0,因为此时p指向的空间已经注销。
例:
int *p;
p=new int;
*p=7;
delete p;
if(a[i]) continue;
if(s==1) break;
if(++count%3==0)
{
a[i]=1;
s--;
}
}
cout<<i+1;
}
循环链表的方法:
#include <iostream>
using namespace std;
2. 可以用字符串常量初始化字符数组。
3. 总是可以用字符串的首地址代表字符串,包括输入、输出、字符串做函数参数。
4. 字符串常量做右值,代表的也是字符串常量的首地址。
5. C语言旧的字符串函数:strcpy(复制)、strlen(求长度)等,这些函数都声明在cstring中。在这些函数中,用来代表一个字符串的参数都是字符串的首地址。
第五讲 指针和字符串

fig05_04.cpp (2 of 2)
fig05_04.cpp output (1 of 1)
&*aPtr = 0012FED4 *&aPtr = 0012FED4 * and & are inverses; same result when both applied to aPtr
5.4 按引用调用函数
5.4 按引用调用函数
(Calling Functions by Reference)
Call by reference with pointer arguments
* operator used as alias/nickname(绰号) for variable inside of function
cubeByReference modified variable number
26 27 28 29 30 31
// calculate cube of *nPtr; modifies variable number in main
void cubeByReference( int *nPtr )
* and & are inverses Cancel each other out *&myVar == myVar and &*yPtr == yPtr
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
fig05_04.cpp (1 of 2)
// a is an integer // aPtr is a pointer to an integer
// aPtr assigned address of a
字符串指针和字符数组,静态全局、静态局部、全局和局部变量区别,字符串常量和字符串变量,程序的内存分配

最近工作之余,发现了两个自己在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语言中,字符串实际上就是一个字符数组。
当我们使用字符串变量时,其实是在使用一个指向这个字符串字符数组的指针。
例如,下面的代码定义了一个字符串变量str,其实就是一个指向字符数组的指针:char str[] = "hello world";可以写成:char *str = "hello world";这两种写法的效果是相同的,都是定义了一个字符串指针str,该指针指向一个字符数组,数组里的内容是字符串“hello world”。
二、字符串指针作为函数参数的原理我们知道,在函数调用时,形参和实参的值是通过栈来传递的,如果形参的类型是指针,实参将会传递该指针指向的地址。
在C语言中,字符串指针作为函数参数时,由于字符串实际上是一个字符数组,所以该指针指向的是该数组的首地址。
在函数中对该指针进行操作时,实际上是在对该字符数组进行操作。
因此,在函数内部修改字符串指针指向的数组时,会影响到主函数中字符串所对应的数组。
三、如何使用字符串指针作为函数参数下面,我们通过一个示例来演示如何使用字符串指针作为函数参数。
假设我们要定义一个函数,求出字符串中字符的个数。
代码如下:#include <stdio.h>int char_count(char *str) {int count = 0;while(*str++ != '\0') {count++;}return count;}int main() {char str[] = "hello world";int count = char_count(str);printf("The length of \"%s\" is %d", str, count);return 0;}上述代码中,我们定义了一个名为char_count的函数,该函数的形参是一个char类型的指针str,实现了对字符串长度的计算。
字符串与指针

字符串与指针1、字符串的表⽰形式 在C程序中,可以⽤两种⽅法访问⼀个字符串:(1)⽤字符数组存放⼀个字符串,然后输出该字符串;(2)⽤字符指针指向⼀个字符串。
//定义⼀个字符数组,对它初始化,然后输出该字符串#include<stdio.h>int main(){char string[]="I love China!";printf("%s\n",string);return0;}和前⾯介绍的数组属性⼀样,string 是数组名,它代表字符数组的⾸元素的地址。
string[4]代表数组中序号为4的元素(它的值是字母v),实际上string[4]就是善(string+4),string+4是⼀个地址,它指向字符“v”。
//可以不定义字符数组,⽽定义⼀个字符指针。
⽤字符指针指向字符串中的字符。
#include<stdio.h>int main(){char *string="I love China!";printf("%s\n",string);return0;}在这⾥没有定义字符数组,在程序中定义了⼀个字符指针变量string,⽤字符串常量“I love China!"对它初始化。
C语⾔对字符串常量是按字符数组处理string的,在内存中开辟了⼀个字符数组⽤来存故该字符串常量。
对字符指针C变量string初始化,实际上是把字符串第1个元素的地址(即存放字符串的字符数组的⾸元素地址)赋string。
有⼈误认为⽪,string是⼀个字符串变量,以为在定义时把“I love China!"这⼏个字符赋给该字符串变量,这是不对的。
定义string的部分:char *string="I love China!"等价于:char *string; string="I love China!";可以看到string被定义为⼀个指针变量,指向字符型数据,请注意它只能指向⼀个字符变量或其他字符类型数据,不能同时指向多个字符数据,更不是把“I love China!"这些字符存放到string中(指针变量只能存放地址),也不是把字符串赋给* string。
06-指针与字符串
char s2[ ]= "book"; 01234 'b' 'o' 'o' 'k' '\0'
指向字符串的指针
#include "stdio.h" int main() { char *ps="hello"; printf("%d %s\n",ps,ps); ps="book"; printf("%d %s\n",ps,ps); return 0; }
指针
指针与字符串
字符串
字符串是由一对双引号" "引起来的多个字符构成 字符串存储时在最后要加上字符串的结束符 ' \0 ' 字符串是借助数组实现的一种构造数据类型,是字符型数 据和数组结合的一种特殊形式
char s1[10]={"hello"}; 0123 'h' 'e' 'l' 'l'
456789 'o' '\0' '\0' '\0' '\0' '\0'
char (*pw)[10];
pw=&week[0];
运行结果:
printf("input 1--7 :"); scanf("%d",&i);
printf("%s\n", pw+i );
return 0;
}
THANKYOU
#include "stdio.h" #include "string.h" int main() { char st[20]="hello";
字符串指针
字符、字符数组、字符串区别
字符
字符数组
字符串
大小
1
定义长度 字符长度加1
长度 不可预计 字符长度
字符长度
常变量
变量
变量
常量
字赋符值串 :长指度向字st符rle类n(型)的内存单元地址 赋字值符: 串指长向度字st符rle类n(型)的内存单元地址
➢ 游标法 字符串大长小度 sitzrleeonf(())
字指符针串 大长小度 sstirzleno(f())
注意C语言编译器不对访问的边界进行检查 字如符果串 越长界度访问st将rle导n(致)不可预计的结果
字符串指针
字符串指针 字符串指针引用 字符、字符数组、字符串区别
主要内容
字符串指针
定义:
➢ char * 变量名
赋值:指向字符类型的内存单元地址
➢ 字符 ➢ 字符数组 ➢ 字符串
注意区别:
➢ 指针大小 sizeof() ➢ 字符串大小 sizeof() ➢ 字符串长度 strlen()
字符串指针引用
访问方法: 字赋符值串 :长指度向字st符rle类n(型)的内存单元地址
赋 字值符:串指 长向 度字st符rle类n(型)的内存单元地址
➢ 指针法 赋字值符: 串指大向小字si符ze类of(型)的内存单元地址
字符、 串字大符小数si组ze、of(字)符串区别
➢ 下标法 如指果针越 大界小访问si将ze导of致(不)可预计的结果
赋注值意: C语指言向编字译符器类不型对的访内问存的单边元界地进址行检查 字注符意串 C语长言度编s译trle器n不(对)访问的边界进行检查
如果越界访问将导致不可预计的结果 字符串大长小度 sitzrleeonห้องสมุดไป่ตู้(())
指向字符串的指针
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语言-指针与字符串
srcStr++;
dstStr++;
} *dstStr = '\0'; }
dstStr++ srcStr++
*srcStr=='\0
*srcStr H e l l o
C h i n a \0
srcStrsrcStrsrcStrsrcStrsrcStsr rcStrsrcStsrrcStrsrcStsr rcStsrrcStsrrcStr
*dstStr H e l l o
C h i n a \0
2020/5/7
dstStrdstStrdstStrdstStrdstStdr stStrdstStdr stStrdstStdr stStdr stStdr stS5/t3r7
例 :计算实际字符个数
方法1:用字符数组实现
unsigned int MyStrlen(char str[])
2020/5/7
8/37
从函数返回字符指针
【例】编程实现strcat()的功能
2020/5/7
返回字符串首地址
9/37
Questions and answers
2020/5/7
10/37ຫໍສະໝຸດ pStr = "Hello China"; 字符指针pStr是变量
2020/5/7
3/37
字符指针
"Hello China"
str H e l l o
C h i n a \0
pStr
定义和初始化方法不同
char str[12] = {"Hello China"};
char *pStr = "Hello China";
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编写一个函数,完成对n个字符串的排序
字符串指针的编程练习
将字符串str1 拷贝到字符串str2. 注意: (1)定义时目的字符串长度应大于源字符串长
度 (2)使用字符串结束标志判断源字符串的结束 (3) 拷贝结束要给目的字符串添加字符串结束
标志 (4)输出目的字符串,查看是否正确拷贝
练习:编写一个合并字符串的函数
用字符串结束标志时误用“\0” 字符指针移动后没有重新指向字符串首地址
printf(“%s\n”,string);
printf(“%s\n”,string+7);
}
I string[0] string[1]
l string[2] o string[3] v string[4] e string[5]
string[6] C string[7] h string[8] i string[9] n string[10] a string[11] ! string[12] \0 string[13]
字符串表示形式
用字符指针实现
string
字符指针初始化:把字符串首地址赋给string
I
char *string;
l
string=“I love China!”;
o
例 main( ) { char *string=“I love China!”; printf(“%s\n”,string);
v e
string
C
string+=7;
h
while(*string)
*string!=0
i
{ putchar(string[0]);
n
string++;
a
}
!
}
\0
字符指针变量与字符数组
char *cp; 与 char str[20]; str由若干元素组成,每个元素放一个字符;而cp中存放 字符串首地址 char str[20]; str=“I love China!”; (×)
char *cp; cp=“I love China!”; (√) str是地址常量;cp是地址变量 cp接受键入字符串时,必须先开辟存储空间
例 char str[10]; scanf(“%s”,str); ()
而 char *cp; scanf(“%s”,cp); ()
改为: char *cp,str[10]; cp=str; scanf(“%s”,cp); ()
字符串指针
教学内容 字符串用字符数组和字符指针表示 用字符指针表示字符串 用字符串指针作函数参数实现关于字符 串的常用操作 明确字符串指针的当前指向
指针如何定义 指针数组的使用 字符串的相关概念
字符串表示形式
用字符数组实现
string
例 main( )
{ char string[]=“I love China!”;
字符数组和字符指针变量都能实现字符串的存储 和运算 字符数组与字符串区别:
(1)字符数组的每个数组元素存放一个字符 ,字符指针变量存放字符串的首地址
(2)对字符数组不能有以下操作:
char str[20]; str = “hello”; 但是字符指针变量可以:char *pstr; pstr =