8.1指针
sizeof(int) 4byte
&:获得变量的地址,操作数必须是变量
printf("%p\n",&i);
printf("%x",&i);
x86和x64 int的结果不同
指针
scanf
·指针 就是保存地址的变量
int i;
int* p=&i;
int* p,q;//*p是一个int int *p,*q;
指针变量:变量的值是内存的地址;普通变量的值是实际的值;指针变量的值是具有实际值的变量的地址
作为参数的指针
void f(int *p) 在被调用的时候得到了某个变量的地址;
int i=0; f(&i); 在函数里面可以通过这个指针访问外面的这个i
&i是i的地址
f函数可以防访问外部变量i
访问那个地址上的变量*
*是一个单目运算符,用来访问指针的值所表示的地址上的变量
int k=*p;
*p=k+1;
传入地址
传入函数的数组:实际上是指针,sizeof(a)==sizeof(int*),但是可以用数组的运算符[]进行运算。
数组变量是特殊的指针
·int *const a[];
8.2字符类型
char是一种整数,也是一种特殊的类型,字符。reason:
01:用单引号表示的字符字面量:‘a','1';
02:''也是一个字符
·printf和scanf 用%c来输入输出字符
c=1
d='1'
printf("c=%d",c); result:c=1
printf("d=%d",d); result:d=49
problem:如何输入'1'这个字符给char c?
scanf("%c",&c);//输入字符型 1相当于49
scanf("%d",&i); c=i;//输入49 得到字符型'1'
--scanf不能处理char型变量 需要赋值给int型变量
混合输入
scanf("%d %c",&i,&c);
scanf("%d%c",&i,&c); 不能读到空格后面的数字 c=32 ' '
字符计算
c='A';c++
·一个字符加一个数字得到ASCII码表中那个数之后的字符
·两个字符的减,得到它们在表中的距离
/*逃逸字符*/
字符 意义
\b 回退一格
\t 到下一个表格位
\n 换行
\r 回车
\" 双引号
\' 单引号
\\ 反斜杠本身
8.3字符串
char word[]={'H','e','l','l','o','!'};字符数组
字符串:char word[]={'H','e','l','l','o','!','\0'};
difference:字符串末尾有一个 \0
字符串:
1、以0结尾的一串字符
2、0和'\0'是一样的,但是和'0'不同
3、0标志字符串的结束,但它不是字符串的一部分,计算字符串长度的时候不包含这个0
4、字符串一数组的形式存在,以数组或指针的形式访问,更多的是以指针的形式
string.h
字符串变量
char *str="Hello"
char word[]="Hello"
char line[10]="Hello"
字符串常量:"Hello"
两个相邻的字符串常量,会自动连接
char *s="Hello World"; 只读
s是一个指针,初始化为指向一个字符串常量
如果需要修改字符串,应该用数组:char s[]="Hello,world!";
本地变量
char *str="Hello";
char word[]="Hello";
数组:这个字符串在这里,作为本地变量空间自动被回收
指针:这个字符串不知道在哪里,用以处理参数,动态分配空间
构造字符串,指针;处理字符串,数组
8.4字符串运算
字符串赋值:
char *t="title";
char *s;
s=t;并没有产生新的字符串,只是让指针s指向了t所指的字符串,对s的任何操作就是对t做的
构建新的字符串 需要字符串函数
字符串的输入输出
char string[8];
scanf("%s",string); 读入一个单词,到空格、tab或者回车为止
不安全 容易溢出
scanf("%7s",string);//最多读7个字符
printf("%s",string);
常见错误:
fisrt:
char *string;
scanf("%s",string);
1、误以为char*就是字符串类型,定义了一个字符串类型的变量string就可以直接使用了
second:
空字符串
char buffer[100]="";
·这是一个空的字符串,buffer[0]=='\0';
char buffer[]="";
·者数组的长度只有 1
字符串函数
string.h
#incldue<string.h>
strlen、strcmp、strcpy、strcat、strchr、strstr
strlen:
size_t strlen(const char *s);//返回s的字符串长度(不包括结尾的0)
strcmp:
int strcmp(const char*s1,const char*s2);//比较两个字符串,返回:
0:s1==s2
1:s1>s2
-1:s1<s2
strcpy:
char*strcpy(char*restrict dst,const char *restrict src);
把src的字符串拷贝到dst
restrict表明src和dst不重叠
返回dst,为了能链其代码来
安全函数版本:
char *strncpy(char *restrict dst,const char *restrict src,size_t n);
char *strncat(char *restrict s1,const char *restrict s2, size_t n);
int strncmp(const char*s1,const char*s2,size_t n);