前言:只会列举常用的,用不到的就不写了,太多了,学不过来;
一,数据类型
1. 结构体
// 结构体
typedef struct {
unsigned int a; //unsigned无符号类型 正数
int b;
} Person;
int main() {
Person *person = malloc(sizeof(Person));
person->a = 33;
person->b = 22;
printf("-----%d\n",person->a);
printf("-----%d\n",person->b);
return 0;
}
2.指针
int *p 在左侧 表示的声明一个地址变量 存的是地址
*p 在右侧 取的是一个指针变量地址 所指向的值,输出的是一个值
// 指针
//1, int *p 在左侧 表示的声明一个地址变量 存的是地址
//2, *p 在右侧 取的是一个指针变量地址 所指向的值,输出的是一个值
void test01() {
int *p = 99; // *p 定义的是一个指针; 99指的是一个地址
printf("------ %d\n", p);
printf("------ %d\n", *p); //所以*p 是找不到值的
//运行打印
//------ 99
//
//Process finished with exit code -1073741819 (0xC0000005)
}
- & 表示含义
// * & 表示含义
void test02() {
int *p; // *p 定义的是一个指针;
int a = 10; // 定义一个实体int变量 a,取值 为10;
p = &a; // p 取a的地址赋值给p
printf("------&a %p\n", &a);
printf("------p %p\n", p);
printf("------&p %p\n", &p);
printf("------*p %d\n", *p); //这里应该是10
//运行打印
//------ 000000000022FE14
//------ 000000000022FE14
//------ 10
}
指针大小 都一样大
void test03() {
char *p;
int *p3;
printf("------ %d\n", sizeof(p));
printf("------ %d\n", sizeof(p3));
//------ 8
//------ 8
}
指针是有类型的;
void test04() {
int *p;
*p = 100L; //demo1 运行会报错,为什么呢? *p 所指向的值是一个long类型;p是int指针
// p = 100L; //demo2 为什么只有写不会错? 存的是一个地址,不是地址所指向的值;
// 这个100L地址,具体存什么,这里是未知的
}
指针赋值问题 与步长问题
void test05() {
int a = 0xaabbccdd;
int *p1 = &a;
printf("------*p1 %x\n", *p1); //demo1 预测打印的是aabbccdd;%x表示16进制的值;
char *p2 = &a; //demo2 这样行吗?char 对应a的地址指向的是个int,和test04冲突?
//可以的,1,*p = 100L;不行的原因是,你硬要在int 类型里面放long
// 2,而&a只是一个地址,*p2取值的时候,只会取char大小的位置的值。后面的都不要了
printf("------&a %d\n", &a);
printf("------*p2 %x\n", *p2);
printf("------p1 %d\n", p1);
printf("------p2 %d\n", p2);
printf("------sizeof(int) %d\n", sizeof(int));
printf("------sizeof(char) %d\n", sizeof(char));
// 步长问题,指针类型决定步长
printf("------p1+1 %d\n", p1 + 1); //demo3; +1 结果是加几呢? 4
printf("------p2+1 %d\n", p2 + 1); //demo4; +1 结果是加几呢? 1
//打印
//------*p1 aabbccdd
//------&a 2293260
//------*p2 ffffffdd
}
3.数组指针
//指向数组的指针(数组指针) , 一个特殊的指针,不用写*,存放的是指针类型
//数组 = 指针 指针 = 数组
//数组指针常量,只能取,不能再赋值
void test06() {
int c[9] = {1, 6, 8, 3, 5, 2, 0, 1, 9};
printf("------c %p\n", c);
printf("------&c %p\n", &c);
printf("------&c[0] %p\n", &c[0]);
printf("------*c %d\n", *c);
printf("------*(c+1) %d\n", *(c + 1));
int *p = c;
printf("------p %p\n", p);
//数组 = 指针 指针 = 数组
for (int i = 0; i < 9; ++i) {
printf("------p[%d] %d\n", i, p[i]);
printf("------p+ %d %d\n", i, p + i);//int 的步长是4;
}
//------c 000000000022FDE0
//------&c 000000000022FDE0
//------&c[0] 000000000022FDE0
//------*c 1
//------*(c+1) 6
//------p 000000000022FDE0
//------p[0] 1
//------p+ 0 2293216
//------p[1] 6
//------p+ 1 2293220
//------p[2] 8
//------p+ 2 2293224
//------p[3] 3
//------p+ 3 2293228
//------p[4] 5
//------p+ 4 2293232
//------p[5] 2
//------p+ 5 2293236
//------p[6] 0
//------p+ 6 2293240
//------p[7] 1
//------p+ 7 2293244
//------p[8] 9
//------p+ 8 2293248
}
*arr = arr[0]
void test07() {
int a = 10;
int b = 20;
int c = 30;
int *p1 = &a;
int *p2 = &b;
int *p3 = &c;
int *arr[3] = {p1, p2, p3};
printf("------arr[0] %d\n", arr[0]);
printf("------*arr %d\n", *arr); // *arr = arr[0]
printf("------*arr[0] %d\n", *arr[0]);
printf("------**arr %d\n", **arr);
char *aa = arr;
printf("------*((int *)aa) %d\n", *((int *) aa));
//------arr[0] 2293244
//------*arr 2293244
//------*arr[0] 10
//------**arr 10
//------*((int *)aa) 2293244
}
维数组
void test08() {
int a[] = {10,20};
int b[] = {50};
int c[] = {30};
int *arr[3] = {a, b, c};
printf("------**arr = %d\n", **arr);
//打印的是20 还是50呢?
printf("------ *(*(arr+1)) = %d\n", *(*(arr+1))); // 为什么要多个*呢,这是二维数组,不然取的是地址
//------**arr = 10
//------ *(*(arr+1)) = 2293268
}