上午的东西其实用的非常少,但是要知道怎么回事
指针与整数的运算:
只能做加和减,其他都不能
指针 + 一个整数 = 指针的地址 + 这个整数 * sizeof(类型);
指针 - 一个整数 = 指针的地址 - 这个整数 * sizeof(类型);
可以用来遍历数组
int nums[] = {1,2,3,4,5};
int *p = &nums[0];
*(p+0);//访问下标0的元素
*(p+1);//访问下标1的元素
for(int i=0;i<长度;i++){
printf("%d ",*(p+i));//或者printf("%d ",*(p++));
}
指针与指针的运算:
只能做减法,关系运算
指针与指针的减法 相当于算出 他们相差几个数据位(元素位);
指针与指针的关系运算:
判断地址是否相等,或者判断他们地址谁更高,谁更低
字符串:
就是一串字符并且以\0结尾
注意:\0是字符串的结尾标识,一遇到\0就代表字符串结束了,不管后面有没有
数组表示法:
char 数组名[] = "字符串";
例:char str[] = "abc"; //长度为4
char str[] = "abc\0";//长度为5
这里如果按照字符串输出,输出abc
char str[] = "abc\0zxc";长度为8
这里如果按照字符串输出,输出abc
字符串常量:
直接写一个字符串
例:"abc";
用指针去指向字符串常量就叫指针字符串
语法: char *变量名 = "字符串";
例: char *str = "abc";
常量存在常量区,程序一启动就开辟,程序退出才销毁。
写在函数内的字符数组的字符串,存在栈区,执行到声明的时候才开辟,出了作用域就回收
常量特性:不可改变
指针字符串和数组字符串的区别:
1.存放的空间不同:
指针字符串所指向的字符串存常量区
数组字符串在本身存放的位置,暂时理解为栈区
2.修改值的不同:
指针字符串不可修改字符串的值
数组字符串可以修改
3.接收用户输入不同:
指针字符串不可以接收用户输入
数组字符串可以接收
4.开辟的空间个数不同:
指针字符串开辟2个空间,一个是存放地址的,一个是存放字符串的(常量区)
数组字符串开辟1个空间,里面就是存放字符串的
字符串的格式化控制符:%s
puts(字符串):输出字符串,自带换行
gets(字符串数组): 输入字符串到数组,可以允许接收空格
常用的字符串函数:
要先导入string.h
1.strcmp:
用法: int strcmp(字符串1,字符串2);
用处: 比较两个字符串是否相同(实际用处)
比较字符串1是否大于字符串2,大于返回正数,等于返回0,小于返回负数
2.strcat:
用法: strcat(字符数组1,字符串2);
用处: 把字符串2接到字符数组1的实际字符串后面
注意:第一个只能传字符数组,否则编译不报错,运行时报错
必须保证字符数组的长度足够大
3.strcpy:
用法: strcpy(字符数组1,字符串2);
用处: 把字符串2复制到字符数组1里面,会覆盖字符数组1原来的字符串
注意:第一个只能传字符数组,否则编译不报错,运行时报错
必须保证字符数组的长度足够大
4.strlen:
用法: strlen(字符串);
用处:计算字符串的实际长度,遇到中文要把那个中文乘以3
原理:一致遍历这个字符串,每次循环计数+1,直到遇到\0则结束
Unicode
UTF-8
ASCII
GB2312
BIG5
计算机刚出来的时候,只认识0和1
那么凭什么让0和1可以显示成各种各样的文字??
比如说 长亮5下,灭2两下,就代表来聊天
男孩本来是表示我爱你
女孩觉得你在说:你妹
要跟女孩建立一个手电筒亮闪的标准:
比如说长亮5下,灭2下代表我爱你,再比如其他的XXXX
计算机很多个厂商:
有的人可能把 0101000001 这样的翻译成 帅
有的人把 0101000001 丑
以前计算机用来帮助打仗的,帮助美军进行情报传递
美军就建立了一套叫ASCII码的值
规定比如说把 1001 0111 就翻译成a
编码,所以也可以叫字符集
但是因为ASCII是美国人发明的,那么它只能表示26个英文字母以及一些其他的英文符号
总计128个,那么只能在美国用
ascii只有128个,但是后面IBM扩充了128个,一共256个,后面扩充的叫后ASCII码
中国想用怎么办?没法用
所以指定了一个国标就叫gb2312,包含了中文常用的汉字和符号,也包含了英文
但是湾湾用繁体,那么他们也有一个字符编码叫 Big5,这个是包含繁体的也有英文
世界一体
ISO组织又开创了一套标准
因为单个字节都被英文用了
UTF-8:这个是包含中文、英文、繁体、阿拉伯等等,中文占用2个字节
UTF-16:在UTF-8基础上扩充的,Unicode 中文占用3个字节
世界更多了,三个字节组合才能表示
*/
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
char str1[] = "abc";
str1[0]= 'z';
char *str2 = "abc";
printf("改之前:%p\n",str2);
// str2[0] = 'z';//这句报错
str2 = "zbc";//可以,但是指向的是一个新的字符串,原来的字符串还是没有发生改变
printf("改之后:%p\n",str2);
return 0;
}
|
|