AutoLeaders控制组—c语言学习笔记

目录

指针

取地址

指针的使用

指针与数组

指针与const

指针运算

指针类型

字符串

字符串是什么

字符串函数头文件

字符串的输入与输出

字符串数组

字符串函数

字符串中找字符

字符串中找字符串


指针

  • 取地址

地址表示是一个量所在的位置,一般一个位置只表示一个量

&为取地址符

%x为16进制

printf("%x",&i)或printf("%p",&i)会输出i的地址,后者更好

取地址时不能做运算

  • 指针的使用

*后面接字母表示这个字母是一个指针变量

其作用就是获得其他变量的地址

如:int*p=i表示指针p指向i变量

printf("%d",*p)输出为p地址上的变量i的值。printf("%p",p)输出为p指向的地址

通过指针,可以在调用函数时改变函数以外的变量

  • 指针与数组

数组变量是特殊的指针,所以通过函数传入数组可以改变函数以外的数组

若定义一个int a[],b[],则

        int *p=a;  这里无需用&取地址

        但数组中的单元为变量,需要用&取地址,且a==&a[0]

        数组是const的指针,无法改变其指向的地址,只能改变地址上这个变量的数值

        所以不能说b[]=a[]

        sizeof(a) 可得到数组a的字节

        sizeof(a)/sizeod(a[0]) 可得数组a的长度

  • 指针与const

int *const q 指指针q无法再指向其他地址;int const i 指i是一个不能改变的值

const int *p=&i / int const *p; 指无法通过p去改变i的值,但p可以重新指向其他变量,i可以做赋值

const int a[] 表示数组里面的每一个单元都无法被修改,所以这个数组需要初始化时就做赋值

  • 指针运算

int *p,a[] ; *p=a

指针加一相当于其指向的地址的下一单元,如*p=a[0];*(p+1)=a[1]

所以*(p+n)==a[n]

*p=a[0] , *q=a[5] , 无论a是int还是char, *q - *p=5

指针做乘除没有意义

指针比大小是比较地址的大小

  • 指针类型

char类型的指针一个单元一个字节,int类型指针一个单元4个字节

不同类型的指针不要做赋值,如:int *p ; char *q ; p=q;

这样会使得q[0],q[1],q[2],q[3]都会变成相同的值,因为int型指针需要占据4个字节

而q的四个变量一共才是4个字节

void *p 表示p不知道指向什么东西的指针

字符串

  • 字符串是什么

字符串的定义可以是 char a[]; 也可以是 char *a;

前者的写法表示这个数组就在这里,所以 a[i] 可修改

但后者写法中a为一个指针,指向字符串常量,从而导致a是只读的,不可写

所以:

  1. 如果要构造字符串,用数组(前者)
  2. 如果要处理字符串,用指针(后者)

字符串相当于一个数组,这个数组的每一个单元为一个字符,占据一个字节

每写出一个字符串,末尾都会有一个结尾的\0

如:char a[]="hello" 中,含有6个字符,分别为'h','e','l','l','o','\0'

双引号中为字符串的字变量

  • 字符串函数头文件

#include<string.h>

要用这个头文件才可以使用字符串函数

  • 字符串的输入与输出

scanf("%s",a) 可以对字符串输入,但输入到空格或回车就会停止

若想要把空格作为一个字符,则需要 gets(a) 来输入

并且如果该字符串为a[8],那么其只能接受7个字符

scanf("%ns",a),n∈N*,表示该字符串最多只能读n个字符,超出部分会交给下一个字符串

输出只需用传统的 printf("%d",a) 即可

  • 字符串数组

1.字符串数组的定义:  char a[][];  表示这是一个字符串数组,且第二个方括号一定要有数字

2. 也可以写成 char *a[] ,这个相当于一个指针,每一项指向一个区域

  • 字符串函数

1.strlen

该函数可以取得字符串除末尾的\0以外的长度

L = strlen(a) 这样就可以使得L等于a[]的长度

strlen函数代码:

#include<stdio.h>
int mylen(const char*s)
{
	int cnt=0;
	while(s[cnt]!='\0'){
		cnt++;
	}
	return cnt;
}

2.strcmp

该函数用于比较两个字符串是否相等

令 p = strcmp(a,b)   //a,b都为字符串

        若a==b,则p=0

        若a<b,则p = a[i] - b[i],这里是指a与b中第一个不相等的字符

strcmp函数代码:

#include<stdio.h>
int mycmp(const char*s1,const char *s2)
{
	int cnt=0;
	while(s1[cnt]==s2[cnt] && s1[cnt]!='\0'){
		cnt++;
	}
	return s1[cnt]-s2[cnt];
}

3.strcpy

该函数用于复制字符串

strcpy(s2,s1);s1为原函数 

并且该函数的返回值是复制之后的函数

strcpy函数代码:

#include<stdio.h>
int mycpy(char*s2,const char *s1)
{
	int cnt=-1;
	do{
		cnt++;
		s2[cnt]=s1[cnt];
	}while(s1[cnt])
	return s2;
}

4.strcat

该函数可以连接两个字符串

strcat(s1,s2)  把s2接到s1后面去,返回结果为s1

5.后三个字符串函数输入时不安全

  • 字符串中找字符

1.char *strchr(const char *s,int c);表示在字符串s中从左到右找c第一次出现的位置

2.char *strrchr(const char *s,int c)表示在字符串s中从右到左找c第一次出现的位置

这两个函数返回类型为指针类型,指向c的位置

#include<stdio.h>
#include<string.h>
int main()
{
	char s[]="hello";
	char *p=strchr(s,'l');
	printf("%s",p);
	
	return 0;
}

这时会输出:llo

#include<stdio.h>
#include<string.h>
int main()
{
	char s[]="hello";
	char *p=strrchr(s,'l');
	printf("%s",p);
	
	return 0;
}

这时会输出:lo

若像找到第二个l

#include<stdio.h>
#include<string.h>
int main()
{
	char s[]="hello";
	char *p=strchr(s,'l');
	p=strchr(p+1,'l');
	printf("%s",p);
	
	return 0;
}

这时会输出:lo

  • 字符串中找字符串

char *strstr(const char *s1,const char *s2);

char *strcasestr(const char *s1,const char *s2);

后者忽略大小写

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值