目录
指针
-
取地址
地址表示是一个量所在的位置,一般一个位置只表示一个量
&为取地址符
%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是只读的,不可写
所以:
- 如果要构造字符串,用数组(前者)
- 如果要处理字符串,用指针(后者)
字符串相当于一个数组,这个数组的每一个单元为一个字符,占据一个字节
每写出一个字符串,末尾都会有一个结尾的\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);
后者忽略大小写