1、基本数据类型
void baseDataType() {
int i = 100;
double d = 200;
float f = 200;
long l = 100;
short s = 100;
char c = 'd';
// 字符串
char *str = "daxiaaaaaa";
// 不是随便打印的,需要占位
printf("i的值是:%d,int所占字节:%d\n", i,sizeof i); // d == 整形
printf("d的值是:%lf,double所占字节:%d\n", d,sizeof d); // lf == long float
printf("f的值是:%f,float所占字节:%d\n", f,sizeof f); // f == float
printf("l的值是:%d,long:%d\n", l,sizeof l); // d == 整形
printf("s的值是:%d,short:%d\n", s,sizeof s); // s == short
printf("c的值是:%c,char所占字节:%d\n", c,sizeof c); // c == char
printf("字符串:%s\n", str); // s == String
}
i的值是:100,int所占字节:4
d的值是:200.000000,double所占字节:8
f的值是:200.000000,float所占字节:4
l的值是:100,long:4
s的值是:100,short:2
c的值是:d,char所占字节:1
字符串:daxiaaaaaa
2、指针
指针用于存放内存地址
&a,表示取a的地址,int * a,表示int类型的指针变量a,可以用于存放a的地址。*a表示取出指针变量对应地址所存放的值,也就100.
int a = 100;
int b = 200;
change(&a, &b);
/**
* 交换数据
* @param a 指针a
* @param b 指针b
*/
void change(int *a, int *b) {
int temp = *b;
*b = *a;
*a = temp;
}
3、多级指针
一级指针存放number的地址,二级指针p2存放一级指针p1的地址,三级指针p3存放二级指针p2的地址
/**
* 多级指针
*/
void pointer() {
int number = 999;
//一级指针存放number的地址
int *p1 = &number;
//二级指针p2存放一级指针p1的地址
int **p2 = &p1;
//三级指针p3存放二级指针p3的地址
int ****p3 = &p2;
printf("通过三级指针取值 %d", ***p3);
}
4、数组与数组指针
/**
* 数组与数组指针
*/
void pointerArray() {
//数组普通使用
int aar[] = {1, 2, 3, 4, 5, 6, 7};
int i = 0;
for (; i < sizeof aar / sizeof(int); i++) {
printf("value is %d\n", aar[i]);
}
//数组与指针的关系
printf("aar = %d\n", aar);
printf("&aar[0] = %d\n", &aar[0]);
printf("&aar= %d\n", &aar);
printf("*aar= %d\n", *aar);
}
value is 1
value is 2
value is 3
value is 4
value is 5
value is 6
value is 7
aar = 643823296
&aar[0] = 643823296
&aar= 643823296
*aar= 1
aar 和&aar[0]和&aar的值都为643823296,意思它们都表示数组的头指针,也就是存放数组第0位数据的地址。因此*aar表示指针aar对应地址所存放的值,也就是数组第0位的值。直观的理解就是aar作为指针指向了数组的第0位。
5、数组指针的使用
- 指针挪动
aar表示头指针,aar赋给aarP,aarP挪动了一位,因此打印*aarP的结果为2
int aar[] = {1, 2, 3, 4};
int *aarP = aar;
aarP++;
printf("value = %d", *aarP);
- 使用指针遍历数组
int aar[4];
for (int j = 0; j < 4; ++j) {
//通过挪动指针方式遍历赋值
*(aar + j) = j;
}
for (int i = 0; i < 4; ++i) {
//通过挪动指针方式遍历
printf("value = %d\n", *(aar + i));
}
for (int i = 0; i < 4; ++i) {
//普通方式遍历
printf("value = %d\n", aar[i]);
}
6、函数指针
可以定义函数指针,把指针传入到另外一个函数,有点类似java的接口回调,kt的高阶函数
//定义函数指针 p
void (*p)(char *, int, int);
//函数指针p 指向 callBack 这个函数
p = &callBack;
//调用downLoad函数,传入函数指针
downLoad(p, "derry.png");
// downLoad(callBack,"daxiaa.png");
/**
* 回调函数
* @param fileName
* @param current
* @param total
*/
void callBack(char *fileName, int current, int total) {
printf("%s的下载进度为:%d/%d", fileName, current, total);
}
/**
* ]
* @param p 函数指针
* @param fileName 文件名字
*/
void downLoad(void(*p)(char *, int, int), char *fileName) {
p(fileName, 5, 10);
}
daxia.png的下载进度为:5/10
7、字符串与指针
- 字符串声明的两种方式
第一种方式,数据存放在栈空间,可以修改里面的值
第二种方式,数据存放在全局区,不能修改
char str[] = {'D', 'e', 'r', 'r', 'y', '\0'};
str[2] = 'z'; // 这里能修改,数据存放在栈空间
printf("第一种方式:%s\n", str); // printf 必须遇到 \0 才结束
char * str2 = "Derry"; // 隐士 Derry+\0
str2[2] = 'z'; // 会奔溃,为什么,不允许访问,这种方式,数据存放在全局区,不能修改
printf("第二种方式:%s\n", str2);
- 字符串与指针的操作
通过指针挪动,对每一位字符小写转换,并且在lower函数中,定义了临时指针temp ,避免破坏传进来的的指针name。
// 指针的理解
char * name = "daXXiaAa";
// 先定义结果
char dest[20];
lower(dest, name);
printf("小写转换后的结构是:%s\n", dest);
void lower(char * dest, char * name) {
char * temp = name; // 临时指针,你只能操作,临时指针,不能破坏name指针
while (*temp) {
*dest = tolower(*temp);
temp ++; // 挪动指针位置 ++
dest ++; // 挪动指针位置 ++ 目的是为了 挪动一个存储一个 挪动一个存储一个 ...
}
// printf '\0'
*dest = '\0'; // 避免printf打印系统值
printf("不能破坏 name:%s\n", name); // temp的好处就是,不会破坏name
}
不能破坏 name:daXXiaAa
小写转换后的结构是:daxxiaaa
- 字符串拷贝
使用strcpy拷贝函数
int main() {
char *str ="daxoiaaa";
char *copy;
strcpy(copy,str);
printf(" value is%s",copy);
return 0;
}
网友评论