C语言指针操作(四)通过指针引用字符串
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
学习日记
前言
一、字符串的引用方式
用字符数组存放一个字符串,可以通过数组名和下标引用字符串中一个字符,也可以通过数组名和格式声明“%s”输出该字符串。
用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串常量。
例1
定义一个字符数组,在其中存放字符串″I love China!″,输出该字符串和第8个字符。
#include <stdio.h>
int main()
{ char string[]="I love China!"; //定义字符数组stingprintf("%s\n",string); //用%s格式声明输出string,可以输出整个字符串printf("%c\n",string[7]); //用%c格式输出一个字符数组元素 return 0;
}
string |
||
I |
string[0] |
|
string[1] |
||
l |
string[2] |
|
o |
string[3] |
|
v |
string[4] |
|
e |
string[5] |
|
string[6] |
||
string(7) |
C |
string[7] |
h |
string[8] |
|
i |
string[9] |
|
n |
string[10] |
|
a |
string[11] |
|
! |
string[12] |
|
\0 |
string[13] |
在C语言中只有字符变量,没有字符串变量。string被定义为一个指针变量,基类型为字符型。它只能指向一个字符类型数据,而不能同时指向多个字符数据。
可以通过字符指针变量输出它所指向的字符串
printf(″%s\n″,string); //%s可对字符串进行整体的输入输出
%s是输出字符串时所用的格式符,在输出项中给出字符指针变量名string,则系统会输出string所指向的字符串第1个字符,然后自动使string加1,使之指向下一个字符,再输出该字符……如此直到遇到字符串结束标志′\0′为止。
注意,在内存中,字符串的最后被自动加了一个′\0′。
对字符串中字符的存取,可以用下标方法,也可以用指针方法。
例2
将字符串a复制为字符串b,然后输出字符串b。用指针变量来处理。
#include <stdio.h>
int main()
{ char a[]="I am a boy.",b[20],*p1,*p2;p1=a;p2=b;//p1,p2分别指向a数组和b数组中的第一个元素for(;*p1!='\0';p1++,p2++) //p1,p2每次自加1*p2=*p1;//将p1所指向的元素的值赋给p2所指向的元素*p2='\0'; //在复制完全部有效字符后加'\0'printf("string a is:%s\n",a); //输出a数组中的字符printf("string b is:%s\n",b); //输出b数组中的字符return 0;
}
二、字符指针作函数参数
用函数调用实现字符串的复制。
例1
用字符数组名作为函数参数
#include <stdio.h>
int main()
{ void copy_string(char from[], char to[]);char a[]="I am a teacher.";char b[]="You are a student.";printf("string a=%s\nstring b=%s\n",a,b);printf("copy string a to string b:\n");copy_string(a,b); //用字符数组名作为函数实参printf("\nstring a=%s\nstring b=%s\n",a,b);return 0;
}void copy_string(char from[], char to[]) //形参为字符数组
{ int i=0;while(from[i]!='\0'){ to[i]=from[i]; i++;}to[i]='\0';
}
例2
用字符型指针变量作实参
#include <stdio.h>
int main()
{ void copy_string(char from[], char to[]); //函数声明char a[]="I am a teacher."; //定义字符数组a并初始化char b[]="You are a student."; //定义字符数组b并初始化char *from=a,*to=b; //from指向a数组首元素,to指向b数组首元素 printf("string a=%s\nstring b=%s\n",a,b);printf("copy string a to string b:\n");copy_string(from,to); //实参为字符指针变量printf("\nstring a=%s\nstring b=%s\n",a,b);return 0;
}
void copy_string(char from[], char to[]) //形参为字符数组
{ int i=0;while(from[i]!='\0'){ to[i]=from[i]; i++;}to[i]='\0';
}
例3
用字符指针变量作形参和实参
#include <stdio.h>
int main()
{ void copy_string(char *from, char *to);char *a="I am a teacher."; //a是char*型指针变量char b[]="You are a student."; //b是字符数组char *p=b; //使指针变量p指向b数组首元素printf("string a=%s\nstring b=%s\n",a,b); //输出a串和b串printf("copy string a to string b:\n");copy_string(a,p); //调用copy_string函数,实参为指针变量printf("\nstring a=%s\nstring b=%s\n",a,b); //输出改变后的a串和b串return 0;
}
void copy_string(char *from, char *to) //定义函数,形参为字符指针变量
{ for(;*from!='\0';from++,to++){ *to=*from;}*to='\0';
}
总结
字符指针作为函数参数时,实参与形参的类型有以下几种对应关系:
实参 |
形参 |
字符数组名 |
字符数组名 |
字符数组名 |
字符指针变量 |
字符指针变量 |
字符指针变量 |
字符指针变量 |
字符数组名 |
三、使用字符指针变量和字符数组的比较
字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),绝不是将字符串放到字符指针变量中。
赋值方式:可以对字符指针变量赋值,但不能对数组名赋值。(数组名是常量)
初始化的含义
char *a="I love China!";======char *a; a=″I love China!″;
存储单元的内容。编译时为字符数组分配若干存储单元,以存放各元素的值,而对字符指针变量,只分配一个存储单元(Visual C++为指针变量分配4个字节)。
char *a,str[10]; a=str; scanf("%s",a);
指针变量的值是可以改变的,而字符数组名代表一个固定的值(数组首元素的地址),不能改变。
字符数组中各元素的值是可以改变的(可以对它们再赋值),但字符指针变量指向的字符串常量中的内容是不可以被取代的(不能对它们再赋值)。
char a[]="House"; a[2]='r';
引用数组元素。对字符数组可以用下标法(用数组名和下标)引用一个数组元素(如a[5]),也可以用地址法(如*(a+5))引用数组元素a[5]。如果定义了字符指针变量p,并使它指向数组a的首元素,则可以用指针变量带下标的形式引用数组元素(如p[5]),同样,可以用地址法(如*(p+5))引用数组元素a[5]。
用指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串。
char *format="a=%d,b=%f\n"; printf(format,a,b);
例
改变指针变量的值。
#include <stdio.h>
int main()
{ char *a="I love China!";a=a+7; //改变指针变量的值,即改变指针变量的指向printf("%s\n",a); //输出从a指向的字符开始的字符串return 0;
}
指针变量的值是可以改变的,而字符数组名代表一个固定的值(数组首元素的地址),不能改变。
指针变量a的值是可以变化的。printf函数输出字符串时,从指针变量a当时所指向的元素开始,逐个输出各个字符,直到遇'\0'为止。而数组名虽然代表地址,但它是常量,它的值是不能改变的。
C语言指针操作
C语言指针操作(一)指针变量
C语言指针操作(二)通过指针引用数组
C语言指针操作(三)*通过指针引用多维数组
C语言指针操作(四)通过指针引用字符串
C语言指针操作(五)*指向函数的指针
C语言指针操作(六)*返回指针值的函数
C语言指针操作(七)*指针数组和多重指针
C语言指针操作(八)*动态内存分配与指向它的指针变量
C语言指针操作(四)通过指针引用字符串相关推荐
- C++之指针探究(四):指针和二维数组
前文:C++之指针探究(三):指针数组和数组指针 一. 二维数组 二维数组通常也被称为矩阵(matrix). 六种初始化方式: (1) int a[3][4] = {1,2,3,4,5,6,7,8 ...
- 指针知识(四):指针数学计算
1. 对指针进行数学运算与其他整型数据类型进行数学运算稍有不同. 首先,对指针只有加法和减法运算,其它运算在指针世界里没有意义.但是指针的加法和减法的具体运算根据它所指向的数据的类型的大小的不同而 ...
- C语言文件操作(四) —— 文件读取结束的判定(feof、ferror)
目录 1.feof.ferror 函数返回值 (1) feof 函数 (2) ferror 函数 2.feof.ferror 函数函数使用 fgetc.fgets的返回值说明都有提到一 ...
- 【C语言】深入浅出理解指针及内存与指针的关系(详细讲解+代码展示)
目录 概述 内存 内存含义 内存作用: 物理存储器和存储地址空间 物理存储器:实际存在的具体存储器芯片. 存储地址空间:对存储器编码的范围. 内存地址 指针和指针变量 指针基础知识 指针变量的定义和使 ...
- ios怎么打开c语言文件操作函数,C++ ofstream和ifstream详细用法以及C语言的file用法...
ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间; 在C++中,有一个stream这个类,所有的I/O都以这个"流"类为基础的,包括我们 ...
- Go基础:指针地址、指针类型、多重指针、指针运算
目录 到底什么是指针呢? 指针 指针地址和指针类型 指针取值 指针变量初始化 指针运算符 多重指针 指针运算 到底什么是指针呢? 内存就是一系列有序列号的存储单元,变量就是编译器为内存地址分配的昵称, ...
- 计算方法c语言上机作业,考研复试-----C语言上机操作(三)
上接(考研复试-----C语言上机操作(二)) [注]为了大家更方便的看完题目,从此以后将代码放在文章末尾! 第一题: 1,问题描述:输入3个数a,b,c,按大小顺序输出. 2,问题思路: 三个数你 ...
- C语言指针基础知识点(四)--通过指针引用数组
指针系列目录 C语言指针基础知识点(一)–指针及指针变量 C语言指针基础知识点(二)–指针变量的引用 C语言指针基础知识点(三)–指针变量作为函数参数 C语言指针基础知识点(四)–通过 ...
- C语言指针操作(一)指针变量
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩:迟一天就多一天平庸的困扰. 学习日记 目录 学习日记 前言 一.指针的概念 二.指针变量 例 注意 1.怎样定义指针变量 2.怎样引用指针变量 注 ...
最新文章
- 在CentOS 6.x上安装luajit 2.0.4
- WinCvs提示:import requires write access to the repository
- 矩阵连乘问题(动态规划算法)
- node-sass安装失败解决方法
- 51nod 1021 石子归并 (动态规划 简单代码)
- libpcap讲解与API接口函数讲解
- 关于android:windowNoTitle不起作用的解决办法
- 充分条件反过来是必要条件吗_“充分必要条件”引发的现实思考
- 修改2440里面的FriendlyARM
- oracle知否有用coherence,Oracle Coherence概述
- 十大简单易用的免费在线HTML编辑器
- 我认为到现在写的最好的一本小说 《紫川》
- 数字音频总线A2B开发详解十一(A2B一Slave板做音效处理-31段EQ,高中低音分频,延时,3D音效等)
- 介绍理想工作计算机 英语作文,我的理想工作(My Ideal Job)
- 北京某牧场管理企业——牧场智慧管理项目
- 我和小米的10年,从米粉到米黑,再到米粉的故事...
- 如何通过喂养菌群产生丁酸调节人体健康
- 大牧絮叨设计模式:建造者模式
- 优雅编程之这样使用CollectionUtils,你就“正常”了(三十五)
- 迈思德物联网网关极简宣传页