C-8-指针C-8-指针
// 简单的指针
void fun1();
void fun1()
{
// 创建一个空得指针
// NULL很等于0
int *p = NULL;
// int *:指针类型
// 指针所占字节大小只有操作系统有关,在64位操作系统下,指针占用8个字节,在32位操作系统下,指针占用4个字节
unsigned long pointSize = sizeof(p);
// 打印指针变量的值
printf("%lu", pointSize);
}
// 取地运算符
void fun2();
void fun2()
{
// 取址运算符
int a = 3;
int *p1 = &a;
printf("&a = %p ", &a);
printf("p1 = %p ", p1);
}
// 取值运算符
void fun3();
void fun3()
{
// 取值运算符
int a1 = 3, b1 = 5;
int *p2 = &a1;
printf("a = %d ", *p2);
p2 = &b1;
*p2 = 100;
printf("b1 = %d ", b1);
// * 和 & 是配套的操作符
}
// 指针的算数运算
void fun4();
void fun4()
{
// 指针的算术运算
int a = 10;
int *p = &a;
p++; // 向高位移动4个字节
p--; // 向低位移动4个字节
// 指针移动几个字节,取决于指针的类型
// 指针的算数运算
int *p2 = &a;
printf("%d ", *p2);
p2++; // 向高位地址移动四个字节
printf("p++ = %d ", *p2);
p2--; // 向低位地址移动四个字节
printf("p-- = %d ", *p2);
// 打印出来的结果是不确定的,可能是
// 移动多少位取决于你指针的类型,整形指针移动4个字节,float指针移动4个字节,double指针移动8个字节,char指针移动1个字节,short指针移动2个字节
// 注意:指针的运算只有加减,没有乘除
}
// 指针的重指向
void fun5();
void fun5()
{
// 指针的重指向
int a4 = 4, b4 = 5;
int *p4 = &a4;
p4 = &b4;
printf("%d", *p4);
// 指针变量的赋值意味着重指向
// 指针变量的重指向
int num1 = 10, num2 = 20;
int *point = &num1;
printf("point = %d ", *point);
point = &num2;
printf("point = %d ", *point);
}
// 指针与数组
void fun6();
void fun6()
{
// 指针与数组
// 数组:用连续内存空间存储数据的构造类型
// 数组名:数组元素首地址
int array[3] = {1, 3, 8};
// array <=> &array[0] // array的意思和&array[0]是相同的
// 指针指向数组
int *arrayPoint = array;
// 此时arrayPoint 与 array 相同
// 取出数组中的第一个元素
int element1 = array[0];
int element11 = *arrayPoint;
printf("element = %d element11 = %d ", element1, element11);
// 指针可以当数组名使用,数组名也可以当指针来使用
int *p = array;
printf("%d %d ", p[0], array[0]);
printf("%d %d ", *p, *array);
// 指针与数组的区别
// 1. 指针的大小只取决于操作系统,与指针的类型无关。数组的大小与数组元素类型和数组元素个数有关
// 2. 数组名是常量地址,不能重指向,指针可以重指向
// 思考?
// 使用指针能否计算出数组元素个数?
// 答案:使用指针可以计算出字符串的长度,因为有结束标示‘