【1】字符数组
概念:一组字符的集合
定义:char s[10];
初始化:
char s[10] = "hello";
char s[10] = {"hello"};
char s[10] = {'h','e','l','l','o'};
字符串结束标志为'\0'
注:如果未对字符串进行初始化,后面需要对字符数组进行赋值时,
可以用strcpy实现。
练习1:实现求字符串实际长度
字符数组输入:
1)按字符输入
for(i=0;i<5;i++)
{
scanf("%c",&s[i]);
}
//必须指定输入多少个字符
2)按字符串输入
scanf("%s",s);
//空格无法输入到数组
3)字符串输入函数gets
char *gets(char *s);
功能:字符串输入函数
参数:char *s 要输入的字符数组首地址
返回值:char * 同参数
//不考虑数组越界问题
字符数组输出:
1)按字符输出
for(i=0;i<5;i++)
{
printf("%c",s[i]);
}
2)按字符串输出
printf("%s",s); //s即为字符串首地址
3)字符串输出函数
int puts(const char *s);
功能:字符串输出函数
参数:const char *s 要输出的字符数组首地址
返回值:int 整型 实际输出的字符个数
输出换行符:
printf("\n");
putchar(10);
putchar('\n');
puts("");
【2】string族函数
1)strlen
#include <string.h>
size_t strlen(const char *s);
功能:计算字符串实际长度(到'\0'截止)
参数:要计算的字符串的首地址
返回值:size_t => int 字符串的实际长度
typedef 重定义
typedef 类型名 自定义名;
typedef signed char int8_t; //等同于将signed char起别名为int8_t;
typedef signed short int int16_t;
typedef signed int int32_t;
typedef signed __INT64 int64_t;
面试题:说一下strlen和sizeof的区别?
答:strlen是个函数,而sizeof是个关键字。
strlen的功能是计算字符数组里存放的字符串的实际长度,
而sizeof是计算的整个数组实际占用的字节数。
2)strcpy
#include <string.h>
char *strcpy(char *dest, const char *src);
功能:字符串复制
参数:char *dest 目标字符数组首地址
const char *src 源字符数组首地址
返回值:char * 目标字符数组首地址
char *strncpy(char *dest, const char *src, size_t n);
参数: size_t n :要复制的字符个数
练习:仿写strcpy的功能
s1[64] = "djakdj" s2[64] = "abc"
puts(s1)
打印结果:abc
研究strncpy的用法 仿写strncpy
3)strcat
#include <string.h>
char *strcat(char *dest, const char *src);
功能:实现字符串拼接
参数:dest 目标字符串地址 src:源字符串的地址 n:要拼接字符的个数
返回值:目标字符串地址
char *strncat(char *dest, const char *src, size_t n);
4)strcmp
#include <string.h>
int strcmp(const char *s1, const char *s2);
功能:比较字符串首个不同的字符的ascii码
参数:字符串的首地址
返回值:
-1 s1 < s2
1 s1 > s2
0 s1 = s2
abcd < abd
比较对应位上数据的ascii码的大小
int strncmp(const char *s1, const char *s2, size_t n);
指定比较字符串的前n位
if(strcmp(s1,s2) == 0)
if(!strcmp(s1,s2))
//用于判断两个字符串是否相等,相等则执行if的语句块。
【3】二维字符数组
char s[3][10]={"hello","world","hqyj"};
打印world:
printf("%s\n",s[1]);
puts(s[1]);
puts(&s[1][0]);
打印‘w’:
printf("%c",s[1][0]);
【3】指针
概念:
地址:内存中每个字节都有唯一的编号,这个编号即为地址。
指针:指针就是地址,地址就是指针。
指针变量:存放地址的变量称之为指针变量。
定义格式:
[存储类型] [数据类型] *指针名
(auto) int *p;
//定义指针变量时,*仅起标识作用,用于说明这个是指针变量。
赋值:
1)指向整型变量
int a = 10;
int *p = &a; //指针变量p里面存放的是a的地址
int a = 10;
int *p;
p = &a;
2)指向数组
int a[5] = {1,2,3,4,5};
int *p = a;
指针运算:
1)算术运算
p+1:访问了高地址方向一个数据的地址,指针的实际指向未改变。
p-1:访问了低地址方向一个数据的地址,指针的实际指向未改变。
p++:指针向高地址方向移动一个数据,指针的指向改变。
p--:指针向低地址方向移动一个数据,指针的指向改变。
2)关系运算 > < == !=
指向高地址的指针大于指向低地址的指针。
指向不同类型数据的指针没有运算关系,指向不同区域的指针运算也没有意义。
3)取值符 *
取址符 &
tip:&和*互为逆运算。
1)int a = 10;
int *p = &a;
访问a的地址:
&a p
访问a的值:
a *p
2)int a[5] = {1,2,3,4,5};
int *p;
p = a;
访问元素a[2]的地址:
&a[2] a+2
&p[2] p+2
访问元素a[2]的值:
a[2] *(a+2)
p[2] *(p+2)
本文介绍了Linux环境下C语言学习中的字符数组和指针基础知识,包括字符数组的概念、初始化、输入输出方法,如使用scanf、gets、puts函数。还探讨了字符串长度计算、字符串复制、拼接、比较的string族函数strlen、strcpy、strcat、strcmp等,并讲解了二维字符数组的使用。最后,简要介绍了指针的概念、赋值、运算以及指针与数组的关系。

462

被折叠的 条评论
为什么被折叠?



