int a =10;
int b=3;
int c= pow(10,3);
//表示10的三次方
unsigned 表示不用补码表示
//数字的输入,%d 包括 char,short,int%u unsigned%ld long long%lu unsigned long long输入 float 是 %f double 是 %lf shuchu dou shi %f保留小数的话是大于5才入,小于等于5舍去
强制转换
(int) 1.67 (short)213 等等
短路
如果&&左边为false,则&&右边不执行。如果||左边为true,则右边不执行。
定义函数
是这样的,下面这个是不返回值的(可以返回一个或0个值)
void 函数名(定义函数的接收变量){
巴拉巴拉
}
int max(int a,int b){int ret;if(a>b){ret=a;}else{ret=b;}return ret;
}//带返回值的函数,函数名前面是int,所以返回的值是int类型,就是说这个函数使用后,他代表函数值.return的作用是,1结束函数,2返回数值
第一行是函数声明,就是告诉c有这么一个函数,当然,如果定义的函数再main函数前,则不需要声明
关于函数的输入
1.函数传进去的只是值,不是这个变量。2. 每个函数有自己的变量空间,参数也位于这个独立的空间中,和其他函数没有关系,就算是字母一样也没有关系。 3. 函数使用完成后,当次的变量空间就消失了,另外变量空间中的变量称之为本地变量。
-
语句里也有变量空间,这个函数函数的空间还不太一样,因为语句里的变量空间中,可以用语句之外的变量
if(a<b){int i =1; }//这里if语句里的大括号里,每次执行完,里面的变量i都会消失,也可以这么理解,属于大括号里的参数,如果执行完这个大括号,那么这个大括号里面的参数也就自然消失了
字符输入函数
```cgets(char*a);char a[100];gets(a);
gets() 函数存在严重的安全隐患,因为它不会检查输入字符串的长度,也不会限制读取的字符数量。如果用户输入的字符串长度超过了字符数组的大小,就会导致缓冲区溢出,可能会覆盖相邻的内存区域,从而引发程序崩溃、数据损坏甚至安全漏洞(如恶意代码注入)。
本地变量规则
数组
集成初始化
int a[]={1,2,3,4,5,6,7,8,9};
//固定位置赋值
数组作为参数
必须再用另一个参数来传入数组的大小。
指针那里会学
函数 search()
search(x,a,sizeof(a)/sizeof(a[0]))//后面那一串代表长度,sizeof(a)是数组的大小,sizeof(a[0])是单个元素的大小,所以一除就是数组的长度
如果找到了,则返回x在数组中的位置,找不到则返回-1
指针
之前定义函数,函数接收主函数的变量的值之后,就不会与原变量有任何关系
但是当函数接受的是变量的地址之后,就有关系了,可以通过接收的地址,去改变地址里的值,也就是变量的值
int *p;
//即定义了指针p
*p=1;
//*p是p指针所指向的地址里面的值,也就是相当于变量,可以赋值,什么的
整数型指针加1,地址是加四的,因为4个地址才能存放一个整数类型。所以要加四,才能跳到下一个整数开头地址
*p++,其中++的优先级要高于 *
字符串
定义方式 每个字符串后面其实都有一个\0;其意义代表字符结束
定义方式
char a="hello";
char a[]="hello";
char *a="hello";//指针相当于数组,但是用指针代表字符数组是他默认是定义了,const类型的,就是只能读不可写的状态,而且如果定义字符串,如果一个字符串分别给两个指针进行定义,则这两个指针地址都是一样的。因为没有开辟新的一样的字符串
scanf9(“%7s”,string);表示只能输入7个字符
其他的函数
strchr(char *a,char c);
从左开始寻找字符c在字符数组里面的地址,他返回的是地址
strrchr 则是从右开始寻找
strstr(char *s1,char *s2);
寻找字符串在哪个位置
strcasestr(char *s1,char*s2);这个忽略了大小写
strlen(char *a);数字符串的长度,但是不带\0
strcmap(char*a,char*b);是比较两个字符串的大小,相等的话,返回0,小于返回-1,否则返回+1
strcpy(char*a,char*b);把b字符串copy到a;
(int*/char*)malloc(长度),用于动态分配地址,用完还需要还回去
关于输出
printf(“%s”,a);
printf
会从这个a这个字符数组起始地址开始,逐个读取字符并输出到标准输出,直到遇到字符串结束符 '\0'
为止。
在这个过程中,printf
函数内部会使用一个临时指针来遍历字符串,但这个操作不会影响作为参数传入的 a
本身。
还有字符串虽然是指针,但是 是特殊的指针,不能进行指针位置的加减
char *a=“lll”;是在存储空间里开辟地址,然后赋值a,但是a仍可以通过a[2]访问l,a[2]本质是指针在移动
- 对于字符数组访问元素的本质
- 当有一个字符数组
char a[] = "ll";
时,使用a[2]
来访问元素,在底层实现上确实和指针运算有关。a[2]
等价于*(a + 2)
。这里的a
在大多数表达式中会 “退化” 为指向数组首元素的指针。 - 但是,这里的关键区别在于数组名
a
本身是一个常量指针。它代表数组首元素的地址,这个地址在数组的生命周期内是固定不变的。
- 当有一个字符数组
- 与指针变量的对比
- 对于
char *a = "ll";
这种指针变量,a
是一个可以被修改的指针。可以通过a++
等操作让它指向不同的内存位置。 - 而对于字符数组
char a[] = "ll";
,不能进行a++
这样的操作来改变数组名a
所代表的地址。例如,下面的代码是错误的:
- 对于
字符输出用%s还是%c
//对于字符串用s,例如
char a[10]={0};
printf("%s",a);
printf("%c",a[0]);
//简单来说就是,单个字符用c,带\0结尾的用%s