知识点概括:
1.指针变量
2.指针与数组
3.指针与字符串
数据的存储
字节是最小的存储单元,一个字节称为一个存储单元(内存单元),不同数据类型所占用的存储单元不等。
为了正确访问内存单元,每个内存单元都有一个编号。内存单元的编号称作地址。
内存单元中的内容才是我们关注的数据
数据的访问方式
数据访问一般分为直接访问和间接访问。
直接访问:直接访问内存单元中的内容。例如: a = 20; b = 2 * a等
间接访问:通过内存单元编号以及数据所占字节数访问内存中数据。
间接访问在程序中随处可见,指针是间接访问的常用方式
//定义一个整形变量
// int a = 10;
// //定义一个指针变量,和定义整型变量类似,也是包含三部分:数据类型 变量名 = 初值
// //只不过指针变量用来存储地址而已
// //int *指针变量类型,p指针变量名,NULL指针变量初值
// //int 的作用:(1)当自增时增加几个字节大小,(2)当存取数据时,一次性读取几个字节
// //定义时,* 告诉编译器,后面的变量是一个指针变量,用来存地址的
// int *p = NULL;
// //指向关系
// p = &a; //将a的地址赋值给p
// printf("%d\n", a); //直接访问 内存单元数据
// // *p, 此时的作用根据指针变量存储的地址,找到对应的内存单元,将内存单元上的数据调取出来
// printf("%d\n", *p); //间接访问
// //对于指针变量类型,所规定的存储空间的大小只和操作系统的位数有关,32位操作系统是4个字节,64位操作系统是8个字节
// printf("%lu\n", sizeof(float *));
// *p = 20;
// printf("%d\n", *p);
// int a = 15;
// //赋值为NULL,让指针变量c指向一个无效的空间
// int *p1 = NULL;
// //当对c指向的空间进行操作时,c必须指向一个有效的空间(明确的空间)
// p1 = &a;
// *p1 = 30;
// int **b = &p1;
// printf("%d\n", *p1);
// printf("%d\n", **b);
// int c = 41;
// p1 = &c;
// printf("%d\n", *p1);
// int d = 1, e = 5, f = 6;
// p1 = &d;
// p1 = &e;
// p1 = &f;
// p1 = &c;
// //指针变量的重新赋值,叫做指针重指向,我们就看操作之前指针最后一次的指向即可
// printf("%d\n", *p1);
// int a[5] = {10, 41, 52, 33, 24};
// int *p = NULL;
//让p指向数组的首地址(数组名a就代表数组的首地址,第一个元素的地址)
// p = a;
// p = &a[2];
// *(p + 2) = 60;
// printf("%d\n", *(p + 2));
// printf("%d\n", *p);
// p++; //p = p + 1
// printf("%d\n", *(p + 4));
//当把数组的首地址赋给指针变量p之后,指针变量就可以当做数组名来使用
//数组名是一个常量,不可对其更改
// for (int i = 0; i < 5; i++) {
// printf("%d\n", p[i]);
// printf("%d\n", *(p++));
// printf("%d\n", *(a + i));
// }
//1.给数组元素赋值
// int a[5] = {0};
// int *p = NULL;
// p = a;
// for (int i = 0; i < 5; i++) {
// *(p++) = arc4random() % 21 + 20;
// }
// p = &a[0]; // 经过5次自增 p的值已不是a[5]数组的首地址,要重置一次
// //2.对数组进行升序排序
// for (int i = 0; i < 4; i++) {
// for (int j = 0; j < 4 - i; j++) {
// if (*(p + j) > *(p + j + 1)) {
// int temp = *(p + j);
// *(p + j) = *(p + j + 1);
// *(p + j + 1) = temp;
// }
// }
// }
// //3.输出数组中元素
// for (int i = 0; i < 5; i++) {
// printf("%d ", *(p++));
// }
// assignArr(a, 5);
// sortArr(a, 5);
// outputArr(a, 5);
// short a[4] = {3, 1, 2, 1};
// int *p1 = a;
// char *p2 = a;
// printf("%d %d", *(p1 + 1), *p2);
//指针与字符串
// char temp[20] = "android";
// char *p = NULL;
// p = temp;
// *(p + 8) = 'a';
// printf("%s\n", temp + 5);
// printf("%c\n", *(p + 5));
// //求字符串长度
// int i = 0; //循环变量初始化(initialization)
// int length = 0; //用来存储字符串的字符的个数
// //condition
// while (*(p + i) != '\0') {
// length++; //statements
// i++; //循环变量增量(increment)
// }
// printf("%d", length);
//指针数组(数组中的每一个元素都是一个指针变量)
// char str = "Frank";
// char *a[3] = {"Frank", "Duck", "iPhone"};
/*
* 字符数组str 需要存储字符,所以把常量区中Frank字符串的内容拷贝到数组中,
而对于数组a来说,数组中的每一个元素都是一个字符型的指针变量,指针变量用来存储地址,
所以将常量区中的Frank,Duck,iPhone的开始地址拷贝到对应的变量中,通过指针操作操作的时常量区的内容
*/
//常量区中的内容不可更改
// printf("%s", a[2]);