不同类型输出:
%d整型输出,%ld长整型输出,
%p指针变量地址,如果数处数据不够8位数,则左边补零,
%o以八进制数形式输出整数,
%x以十六进制数形式输出整数,
%u以十进制数输出unsigned型数据(无符号数)。
%c用来输出一个字符,
%s用来输出一个字符串,
%f用来输出实数,以小数形式输出,
%e以指数形式输出实数,
%g根据大小自动选f格式或e格式,且不输出无意义的零。
————————————————
%a(%A) 浮点数、十六进制数字和p-(P-)记数法(C99)
%c 字符
%d 有符号十进制整数
%f 浮点数(包括float和doulbe)
%e(%E) 浮点数指数输出[e-(E-)记数法]
%g(%G) 浮点数不显无意义的零"0"
%i 有符号十进制整数(与%d相同)
%u 无符号十进制整数
%o 八进制整数 e.g. 0123
%x(%X) 十六进制整数0f(0F) e.g. 0x1234
%p 指针
%s 字符串
%% "%"
1.函数:C中函数传递的是值,不是地址值。不会对原变量进行操作。
例如:1.函数的传值与传址(ab与xy是俩个完全独立的空间,地址是不一样的)
//swap1在被调用的时候,实参传给形参,其实形参是实参的一份临时拷贝
//改变形参,不能改变实参
//形参是在函数调用的时候才实例化,才开辟内存空间
void Swap1(int x, int y)//
{
int z = 0;
z = x;
x = y;
y = z;
}
void Swap2(int* pa, int* pb)//
{
int z = 0;
z = *pa;
*pa = *pb;
*pb = z;
}
int main()
{
int a = 10;
int b = 20;
//写一个哈函数 - 交换2个整型变量的值
Swap1(a, b);//传值调用
printf("交换前:a=%d b=%d\n", a, b);
Swap2(&a, &b);//传址调用
printf("交换后:a=%d b=%d\n", a, b);
return 0;
}
c语言库:主要有:IO操作、字符串操作、字符操作、内存操作、时间操作、数学操作、其他操作。
2指针: 指针类型存储不同类型,对指针类型变量操作时,改变的具体值是不一样的:例如:int* p,改变时是操作4个字节, char* cp ,改变操作时操作1个字节。
2.1 野指针:1局部变量内存释放后,指针变为野指针。2 数组越界后
3 分模块开发时: 本地库使用:<> 自定义头文件: ""
引入本地库:#include <stdio.h> 引入自己定义的h头文件: #include "add.h"
4 数组:数组创建, [] 中要给一个常量才可以,不能使用变量
4.1 sizeof和strlen区别:
arr2中的abc没有\0(\0为字符串结束标识),arr1中存储的为 “abc\0”
4.2 数组大小:
4.3 二维数组不能省略列的下标: int arr[3][] ={{1,2,3,4},{5,6,7,8}} 这种事错误的,但是这种可以:int arr[][4] ={{1,2,3,4},{5,6,7,8}}
4.4 数组传值时,传的是首元素地址值,需要使用数组个数,需要在函数参数中传递,不然获取不到数组个数的。 下面的例子中, void bubble_sort(int arr[]) 函数中 int sz = sizeof(arr)/sizeof(arr[0]); 得到的sz为1 因为 此时传递的是&arr[0] 的地址值, sizeof(arr) == sizeof(arr[0])
//方法1:
#include <stdio.h>
void bubble_sort(int arr[])
{
int sz = sizeof(arr)/sizeof(arr[0]);//这样对吗?
int i = 0;
for(i=0; i<sz-1; i++)
{
int j = 0;
for(j=0; j<sz-i-1; j++)
{
if(arr[j] > arr[j+1])
{
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
int main()
{
int arr[] = {3,1,7,5,8,9,0,2,4,6};
bubble_sort(arr);//是否可以正常排序? 此时传递的是&arr[0] 的地址值
for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
{
printf("%d ", arr[i]);
}
return 0; }
4.5 数组名的含义:
所以&arr是取得整个数组的地址