strcpy(ch1,ch2);拷贝,是将ch2的内容拷贝到ch1中,全部覆盖原有的
strcmp(ch1,ch2);比较,将两个字符串中的字符一个一个比较,用ascii码值比较,如果ch1>ch2,则返回>0,否则<0,空字符的ascii码值为0,而0得ascii码值为48
strlen返回字符串的可见长度,不包括 ‘ \0 ’ ,如果字符串中有\0则提前结束,但是\0后有数字则不把\0当空字符处置,当做一个标志,标志后面的数字是八进制,直到遇到超过八进制的数字为止,遇到\x是将后面的数字和字母当成十六进制的标志
指针的声明声明是 数据类型 * p;
int *p,aa;相当于 int * p; int aa;
int *p; p=a;定义一个Int型指针p后,p保存a的地址,则* p表示地址解析符,取出地址p的值,也就是a的地址中的值,但 * p也相当于变量a,相当于* p既可以当成a,又可以当成里面的常量值,所以当有一个int * q = a;时,* p = *q可以成立,它就是a=2; p是一个地址的简写,也可以成为一个地址的名,也可以称为p就是一个地址
一个指针代表一个地址,空指针则代表等待地址赋值
倘若p,q都是同一类型的指针变量,则 p=q;中,p代表变量,q代表常量,也就是吧q中的常量值赋值给变量p,也因此可知,有值得变量可以赋值给另一个变量,赋值的时候,赋的是变量里面的常量值,被赋值的是一个变量改变自身地址中地常量值,改为符号运算符的右边那个值。
指针只定义没有初始化的时候,不能用,用了可能系统就挂了
使用:用来改变一个变量的值,通过指针
用来使函数返回多个值,通过指针
二级指针:指向一级指针的指针,其内存着一个值,值是一级指针的地址
int x=y=0;因为赋值运算符的右结合性,所以此时y=0时,y的类型没确定就相当于 y=0; y需要先确定类型后,才可以赋值,所以int x,y;x=y=0时成立。
对于二维数组b[i][j]而言,b[i]表示第i行,第一列的地址,可sizeof算出第i行的所有元素的长度
b=b[0]都是第一行,第一列的地址,但是b可以算出所有元素的长度
b[0][0]代表第一行第一列的元素数值
二维数组中,元素的地址是连续的
数组的行数=sizeof(b)/sizeof(b[0]);(总长度/一行的长度=行数)
数组的列数=sizeof(b[0])/sizeof(int);(一行的长度/一个元素的长度=列数)
将二维数组作为参数接收时,行可以不写,列必须写,如果列不符合会自动转换
字符串可见长度为已保存字符的长度,数组的长度也就是可输入的长度,实际长度为设置的长度也就是包含\0的长度
静态初始化剩余的补当前类型的0,所有字符数组会补\0,通常定义的同时初始化
\0:空字符
%s输出字符串,从给定的地址开始到 ’ \0 ‘ 结束
对于b[i][j],b[i]代表地址,b[i][j]代表数值
但对于一位数组b[i],b[i]代表数值
输入时,需要输入到地址内,所以代表数值的用&,代表地址就不用&
字符串长度计算,用循环来判断是否到 ’ \0 ‘ ,用 ‘ i ’ 来保存长度
puts(char);自带换行输出,用puts没法格式化输出
gets(char);一种不安全的数组输入,因为不会检测你输入的长度,等于scanf(“%s”,ch); ,但scanf不能有空格,gets可以。
strcat(ch1,ch2)把后面的数组放在前面的数组后面,前一个数组的\0会被覆盖,注意ch1的长度要大于ch1与ch2之和
初始化时 ‘ \0 ‘ 不能乱用,否则读取到此位置时,就结束了,但0可以,如果用scanf和gets输入,则\0被当成‘ \ ’ 和 ‘ 0 ’ 来存储,而初始化时会被当做结束符
动态赋值数组时,要记得加 ‘ \0 ‘ 不然会存储垃圾值
字符串的赋值如:a[i]=” “;