一、今天安排。
1、const指针。
2、strlen字符串函数。
3、讲题目。
4、2点到4点。 --> 自己做题目
5、4点继续讲字符串函数。
二、const指针。
1、什么是const指针?
在学习这个知识点之前,已经学习过很多的指针类型,例如整型指针(int*),字符指针(char*)
const指针并不是指向const这种类型的数据的指针,const不是一个类型,而是一个修饰关键词。
2、const关键词的使用场景?
const关键词一般出现在形式参数中。
1)不使用const的情况下。
void func(int x) //x = age
{
printf("x = %d\n",x); //18
x = 19; //x可以修改为随意值。
printf("x = %d\n",x); //19
}
int main()
{
int age = 18;
func(age);
}
2)使用const关键词的情况下。
//加了const之后,一旦x赋值了某一个值,那么不能通过x去修改x本身的值
void func(const int x) //x = age
{
printf("x = %d\n",x); //18
//x = 19; //x可以修改为随意值。
printf("x = %d\n",x); //19
}
int main()
{
int age = 18;
func(age);
}
3、但是一般情况,const关键词很少会修饰普通变量,大部分时间都是修饰指针。
#include <stdio.h>
int main(int argc,char *argv[])
{
/* 普通变量 */
/*
const int a; //已经赋值了随机值
a = 10; //不能通过a修改a的值。
printf("a = %d\n",a);
*/
/* 编译通过
int a = 100;
int b = 50;
int *p = &a;
p = &b;
printf("*p = %d\n",*p); //50
*/
/* 编译出错
int a = 100;
int b = 50;
int * const p = &a; //const修饰的是p,所以一旦赋值了某一个值之后,就不能给p赋值了。
p = &b;
printf("*p = %d\n",*p);
*/
/* 编译通过
int a = 100;
int b = 50;
int * const p = &a;
//*p = 30; const修饰的是p,不是修改p指向的内容,所以我们可以通过p修改p指向的内容。
printf("*p = %d\n",*p);
*/
/* 编译通过
int a = 100;
int b = 50;
const int *p = &a; //const修饰的是p指向的内容,不是修饰p的本身,所以还可以给p的本身赋值。
p = &b;
printf("*p = %d\n",*p); //50
*/
/* 编译出错
int a = 100;
int b = 50;
const int * p = &a; //const修饰的是p指向的内容
//*p = 30; //不可以通过p修改p指向内容。
//a = 30; //由于a没有被const修饰,所以a可以随意改。
printf("*p = %d\n",*p);
*/
/* 编译通过
int a = 100;
int b = 50;
int const *p = &a; //const修饰p指向的内容,没有修饰p的本身
p = &b; //所以p可以随意改。
printf("*p = %d\n",*p);
*/
int a = 100;
int b = 50;
int const *p = &a; //const修饰p指向的内容,没有修饰p的本身
*p = 30; //所以不可以通过p改p指向的内容。
printf("*p = %d\n",*p);
return 0;
}
三、计算字符串的长度。 -- strlen()
1、系统已经为我们提供了一系列关于字符串处理的函数接口,我们直接调用即可。
如果这些函数不懂,那么我们只需要在man手册中查询即可。
gec@ubuntu:/mnt/hgfs/GZ2180/01 C语言/09/code$ man 3 strlen (按'q'退出)
2、分析函数的使用办法。
NAME(简单的概述)
strlen - calculate the length of a string
//计算字符串的长度
SYNOPSIS
//头文件:如果在代码中使用了strlen()这个函数,就一定要包含#include <string.h>
#include <string.h>
//strlen的函数声明
size_t strlen(const char *s);
参数:
s: 需要计算长度的字符串
返回值:
成功:字符串实际的字符个数
3、strlen函数与sizeof()关键词有什么区别?
strlen():用于计算字符串实际字符个数。
计算机制:
给定一个地址,判断该地址上的值是否为\0?
如果不是,则计算一个长度的单位,然后将地址往后挪动一个单位,再继续判断。
如果是,则停止计算。
sizeof():用于计算内存空间的占用大小。
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
char A[100] = "helloworld";
char *p = "helloworld";
printf("strlen(A) = %ld\n",strlen(A)); //10 10 10 10 10
printf("strlen(p) = %ld\n",strlen(p)); //10 10 10 10 10
printf("sizeof(A) = %ld\n",sizeof(A)); //100 100 100 100 100
printf("sizeof(p) = %ld\n",sizeof(p)); //11 11 10 10 8
return 0;
}
练习: 指针习题(C语言).doc 15 18
四、将字符串拷贝到某段内存空间。 --> strcpy() --> man 3 strcpy
查询方式: 直接在终端上输入查询命令。
gec@ubuntu:/mnt/hgfs/GZ2180/01 C语言/06$ man 3 strcpy
功能: strcpy, strncpy - copy a string
//复制一个字符串
头文件:
#include <string.h>
原型:
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
参数:
dest: 目标区域
src: 需要拷贝的字符串
n: 需要处理的前n个字节
返回值:
成功:返回指向dest区域的地址
失败:NULL
-----------------
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
char A[10] = {0};
//strcpy(A,"hello");
strncpy(A,"hello",3);
printf("A = %s\n",A);
return 0;
}
-------------------
strcpy使用场景: 在定义数组之后,还可以整体初始化。
char A[10];
A[0] = 'h';
A[1] = 'e'; --> 定义时,没有初始化,那么在后面只能单个单个地赋值。
char A[10];
A = "hello"; //这句话不不不不不不不不不不不对!
char A[10];
strcpy(A,"hello"); //这句话对对对对对对对对对对对对!
五、对比两个字符串是否一致? --> strcmp() --> man 3 strcmp
功能: strcmp, strncmp - compare two strings
//对比两个字符串
头文件:
#include <string.h>
函数原型:
int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
参数:
s1: 需要对比的字符串1
s2: 需要对比的字符串2
n: 需要对比的前n个字节
返回值:
s1 > s2 -> 大于0
s1与s2匹配 -> 等于0
s1 < s2 -> 小于0
-----------------------------------
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
char A[10] = "hella";
char B[10] = "hello";
int ret = strncmp(A,B,3);
printf("ret = %d\n",ret);
return 0;
}
--------------------------------
六、将某一个字符串追加到另外一个字符串的末尾。 --> strcat() --> man 3 strcat
功能: strcat, strncat - concatenate two strings
//拼接两个字符串
头文件:
#include <string.h>
使用格式:
char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);
参数:
dest: 目标区域的地址
src: 需要追加到别的字符串后面的那个字符串的地址
n:只追加src前面的n个字节
返回值:
成功:指向dest区域的地址
失败:NULL
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
char A[20] = "hello";
strncat(A,"world",3);
printf("A = %s\n",A);
return 0;
}