C语言数据类型
- 基本数据类型
- char
- short
- int
- long
- double
- float
- 构造类型
- 数组
- 结构体 struct
- 共用体 union
- 枚举类型 enum
- 指针类型
- 空类型 void
基本类型使用的占位符
- int---------%d
- float---------%f
- double---------%lf 或者 %f
- short---------%d
- long---------%d
- char---------%c
- char * ---------%s
- & (取地址符)--------%p
关于布尔类型:
非0即true, 0就是false
基本类型占用的字节数
- int---------4 字节
- float---------4 字节
- double---------8 字节
- short---------2 字节
- long---------8 字节
- char---------1 字节
- char * ---------8 字节
地址
C、C++(对象) 万物皆指针,指针就是地址,& 符号是用来取地址的
变量的地址
int number_int = 100;
double number_double = 200;
printf("number_int的地址是:%p\n", &number_int);
printf("number_double的地址是:%p\n", &number_double);
number_int的地址是:0x16f60f3d8
number_double的地址是:0x16f60f3d0
获取变量的值有三种方法:
- 在取出的地址前面加 * 就能再次得到变量所赋予的值
printf("number_int的值是:%d\n", *(&number_int));
printf("number_double的值是:%lf\n", *(&number_double));
- 赋值给指针
int * intP = &number_int;
double * doubleP = &number_double;
printf("number_int的值是:%d\n", *intP);
printf("number_double的值是:%lf\n", *doubleP);
- 最直接的输出
printf("number_int的值是:%d\n", number_int);
printf("number_double的值是:%lf\n", number_double);
三种方法展示的最后的结果:
number_int的值是:100
number_double的值是:200.000000
数组的地址
数组就是一个内存地址,所以数组的内存地址是它自己本身,也是它第一个元素的内存地址
int arr[] = {1,2,3,4};
printf("arr = %p\n", arr);
printf("&arr = %p\n", &arr);
printf("&arr[0] = %p\n", &arr[0]);
输出的结果:
arr = 0x16fabf3c0
&arr = 0x16fabf3c0
&arr[0] = 0x16fabf3c0
数组地址的移动寻值
我们可以将数组地址赋值给指针,通过挪动指针,取出对应地址的值
int arr[] = {1,2,3,4};
int * arr_p = arr;
printf("%d\n", *arr_p);//取出元素一内存地址的值 1
arr_p ++; // 指针向后挪动一位 获取元素二的内存地址
printf("%d\n", *arr_p); // *arr_p 取出元素二内存地址的值 2
arr_p += 2;// 指针在元素二的位置向后挪动两位
printf("%d\n", *arr_p); // 取出元素四内存地址的值 4
arr_p -= 3; // 挪动指针指向到 元素一
printf("%d\n", *arr_p);//取出元素一内存地址的值 1
arr_p += 60; //挪动指针指向往后的第 60 位
printf("%d\n", *arr_p); // 取出的值由于超过数组,所以展示的是系统值
1
2
4
1
1836497649
指针、内存地址、指针别名的理解
- 指针:就是内存地址
- 内存地址:就是指针
- 指针别名:指针变量,是指针的变量
指针
在取出的地址前面加 * ,表示拿到该地址所对应的值
通过指针修改变量的值
int i = 100;
int * p = &i;
*p = 300;
printf("i的值是:%d\n", i);
输出结果:
i的值是:300
函数
函数的三点注意事项
- C语言与 Java 和 C++ 不同,C语言不允许函数重载
- 函数要先声明,再实现
- 如果忘记声明,函数要写在 main 方法前面,否则会报错
由于C语言不支持函数重载,所以声明的函数,参数可写可不写
通过函数修改数值
void changeValue(int * temp);//函数声明
int main() {
int i = 1;
changeValue(&i);
printf("i的值是:%d\n", i);
printf("main函数,i的内存地址是:%p\n", &i);
return 0;
}
//函数实现
void changeValue(int * temp){
printf("changeValue函数,i的内存地址是:%p\n", i);
*temp = 886;
}
main 函数中的 i 和 changeValue 函数 temp 的内存地址是一样的
输出结果:
changeValue函数,i的内存地址是:0x16d72f3d8
i的值是:886
main函数,i的内存地址是:0x16d72f3d8
通过函数交换数值
void changeAction(int * a, int * b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int a = 4000;
int b = 200;
printf("交换前的效果:a=%d,\tb=%d\n", a, b);
changeAction(&a, &b);
printf("交换后的效果:a=%d,\tb=%d\n", a, b);
}
输出结果:
交换前的效果:a=4000, b=200
交换后的效果:a=200, b=4000
不论是通过函数修改数值还是交换数值,都是接收的指针(即内存地址)
网友评论