指针的运算:
指针和整数进行运算
公式:指针 + n = 指针保存的地址 + n * sizeof(指针指向的类型)
指针 - n = 指针保存的地址 - n * sizeof(指针指向的类型)
注意:指针和整数的运算,只能做加减,不能做其他的
指针和指针的运算:
只能做减法运算!
算出他们相差几个数据位(元素位)
1000 0000 0000 0000
第一位叫符号位:如果有1代表是负数
但是如果你用unsigned类型来存储上面这段二进制的话
注意:如果得到的是负数,那么证明被减数在减数的前面(低位)
字符串:
它是一串字符序列,以'\0'结尾
'\0'其实就是0
字符串两种表示法:
1.数组表示法:
char 字符串名[] = "字符串";
2.指针表示法:
char *字符串名 = "字符串";
他们两种的区别:
1.字符串实际存储的位置不同:
数组表示法的字符串存在栈
指针表示法的字符串存在常量区
2.开辟的空间个数不同:
数组表示法只开辟一个空间,开辟在栈区(局部变量)
指针表示法开辟两个空间,一个在常量区,一个在栈区(局部变量)
栈区保存字符串的地址,常量区才保存字符串
3.字符串可变与不可变的区别:
数组表示法可以修改字符串内容
指针表示法不能修改字符串内容(常量不可变)
4.可否接收用户输入的区别
数组表示法可以接收用户输入
指针表示法不能接收用户输入(常量不可变)
如果要输出字符串:
用printf搭配%s,那么系统会自动输出字符一直遇到\0则结束输出
还可以用puts(字符串);
puts和printf的区别:puts自带换行,puts只能输出字符串
如果要输入字符串:
用scanf搭配%s
gets(字符数组);
scanf和gets的区别:scanf不能接收到空格,默认把空格当做字符串结束了,gets可以接收空格,不会当字符串结束了
字符串常用的函数:
1.先导入string.h
1.strcmp:
strcmp(字符串1,字符串2);
作用:比较两个字符串是否相等,相等返回0,否则非0
详细来说:问字符串1比字符串2大吗?如果大,返回正数,如果小返回负数,如果相等返回0
2.strcat:
strcat(字符数组,字符串2);
作用:把字符串2添加到字符数组的后面
注意:字符数组的长度必须足够长
3.strcpy:
strcpy(字符数组,字符串2);
作用:将字符串2复制给字符数组,会覆盖字符数组原来的内容
其实就是给字符数组重新赋值
注意:字符数组的长度必须足够长
4.strlen:
strlen(字符串);
作用:计算字符串的实际个数(不包括\0)
原理:遍历字符串,每遍历一个字符,个数+1,直到\0则结束
*/
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
/*
int num = 10;
int *p = #
printf("%p\n",p);//0x7fff5fbff77c
printf("%p\n",p+1);//0x7fff5fbff780
printf("%p\n",p-1);//0x7fff5fbff7
*/
/*
int nums[] = {10,11,12,13,14};
int *p1 = &nums[0],*p2=&nums[3];
printf("%ld\n",p1-p2);//-3 %lu unsigned long 只能放正数
*/
//指针与整数的运算遍历数组
/*
int nums[] = {1,2,3,4,5};
int len = sizeof(nums) / sizeof(int);
// int *p = &nums[0];
//
// for (int i=0; i<len; i++) {
//
// printf("%d ",*(p+i));
// }
//指针自增进行循环
// int *p = &nums[0];
//
// for (int i=0; i<len; i++) {
//
// printf("%d ",*(p++));
// }
//
//上面和下面是一个意思
// for (int i=0; i<len; i++) {
//
// printf("%d ",*p);
//
// p++;//p = p+1;
// }
// int *p = &nums[len-1];
//
// for (int i=0; i<len; i++) {
//
// printf("%d ",*(p-i));
// }
int *p = &nums[len-1];
// for (int i=0; i<len; i++) {
//
// printf("%d ",*p);
//
// p--;
// }
//上面下面一样
for (int i=0; i<len; i++) {
printf("%d ",*(p--));
}
*/
//字符串的输入和输出
/*
char str1[10] = "abc\0edc";
//scanf("%s",str1);//数组名本身就是地址了,所以不用加&,但是加了也不会报错,也可以正常使用
gets(str1);
puts(str1);
// printf("%s\n",str1);//abc
//
// puts(str1);
//
// char *str2 = "abc";
// str1[1] = 'z';
//
// puts(str1);
//str2[1] = 'z';//运行时报错
*/
//strcmp
/*
int res = strcmp("zbc", "bbc");
printf("%d\n",res);//正数
*/
//strcat
/*
char str[50] = "哈哈";//这个可以
//char *str = "哈哈"; strcat的第一个参数不可以用指针表示法
char str2[] = ",你们也很帅";
strcat(str, str2);
puts(str);//
*/
//strcpy
/*
char str[50] = "abc";
strcpy(str, "qwe");//注意第一个参数不能用指针表示法,只能用数组表示法
puts(str);//qwe
*/
//strlen
/*
char str[4] = "abc";
printf("%lu\n",strlen(str));//3
// char str[] = "abc\0aaa";
// printf("%lu\n",strlen(str));//3
// char str[] = "abc\naaa";
// printf("%lu\n",strlen(str));//7
// char str[] = "abc哈";
// printf("%lu\n",strlen(str));//6个,因为一个中文占3个字节
// char str[] = "abc哈,";
// printf("%lu\n",strlen(str));//9个,因为一个中文占3个字节,中文符号也是3个字节
char *str = "abc哈";
printf("%lu\n",strlen(str));//6个,任意形式的字符串都可以传给strlen
*/
return 0;
}
|
|