c-指针
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\n", &a);
printf("p1 = %p\n", p1);
}
// 取值运算符
void fun3();
void fun3()
{
// 取值运算符
int a1 = 3, b1 = 5;
int *p2 = &a1;
printf("a = %d\n", *p2);
p2 = &b1;
*p2 = 100;
printf("b1 = %d\n", b1);
// * 和 & 是配套的操作符
}
// 指针的算数运算
void fun4();
void fun4()
{
// 指针的算术运算
int a = 10;
int *p = &a;
p++; // 向高位移动4个字节
p--; // 向低位移动4个字节
// 指针移动几个字节,取决于指针的类型
// 指针的算数运算
int *p2 = &a;
printf("%d\n", *p2);
p2++; // 向高位地址移动四个字节
printf("p++ = %d\n", *p2);
p2--; // 向低位地址移动四个字节
printf("p-- = %d\n", *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\n", *point);
point = &num2;
printf("point = %d\n", *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\n", element1, element11);
// 指针可以当数组名使用,数组名也可以当指针来使用
int *p = array;
printf("%d %d\n", p[0], array[0]);
printf("%d %d\n", *p, *array);
// 指针与数组的区别
// 1. 指针的大小只取决于操作系统,与指针的类型无关。数组的大小与数组元素类型和数组元素个数有关
// 2. 数组名是常量地址,不能重指向,指针可以重指向
// 思考?
// 使用指针能否计算出数组元素个数?
// 答案:使用指针可以计算出字符串的长度,因为有结束标示‘\0’,不可以计算其它类型的数组长度,没有结束标示
// 使用不同类型的指针指向数组,不会崩溃,但是得到的结果不是错误的
short a[4] = {3 , 7 , 9 , 1};
int *p1 = a;
char *p2 = a;
}
// 指针与字符串
void fun7();
void fun7()
{
// C语言使用字符数组保存字符串
char string[10] = "iPhone";
// string为数组名,同时也是数组的首地址。
char *p = string;
// 如何使用p输出字符串。
printf("%s\n", p);
// 字符指针可以操作单个字符,也可以操作字符串。
char str[] = "Macbook Pro";
char *str1 = "MacBook Air";
// 字符数组中的字符可以修改
str[0] = 'm';
printf("str = %s\n", str);
// 指针指向的字符串不可以修改,因为字符串处在常量去,但是指针可以重指向
// str1[0] = 'm'; // 不可以修改
str1 = "Mac Pro";
printf("str1 = %s\n", str1);
}
// 练习1
void pratice1();
void pratice1()
{
// 使用指针计算计算字符串的长度
char string[] = "iPhone";
char *p = string;
int count = 0;
while (*p++ != '\0') {
count ++;
}
printf("字符串长度是:%d", count);
}
// 指针数组
void fun8();
void fun8()
{
// 指针数组
char *string[] = {"iOS", "Android", "WP8"};
// 循环取值
for (int i = 0; i < 3; i++) {
printf("%s\n", string[i]);
}
}
// 指针与函数
void change(int *a, int *b);
void change(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void fun9();
void fun9()
{
// 使用函数,交换两个实参的值
int a = 10, b = 20;
printf("交换前:a = %d b = %d \n", a, b);
change(&a, &b);
printf("交换后:a = %d b = %d \n", a, b);
}
int main(int argc, const char * argv[])
{
// 注意:*p :其中的‘*’是有两层意义的
// 在定义指针变量的时候,‘*’的作用是告诉编译器,这就是一个指针
// 在通过指针取值的时候,‘*’的作用是取值运算符,是访问内存地址为p的存储区域
// '*'的不同作用:
// 指针变量定义时: 只起修饰作用,告诉编译器p是指针
// 指针变量取值时: 访问内存地址为p的存储区域
// 简单总结
// 指针变量是存放地址的变量,指针变量的赋值,意味着指针的重指向。
// 数组名代表数组的首地址,而且是常量地址,不可以修改。
// 函数调用时,形参拷贝了实参的值。
return 0;
}
// 简单的指针
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\n", &a);
printf("p1 = %p\n", p1);
}
// 取值运算符
void fun3();
void fun3()
{
// 取值运算符
int a1 = 3, b1 = 5;
int *p2 = &a1;
printf("a = %d\n", *p2);
p2 = &b1;
*p2 = 100;
printf("b1 = %d\n", b1);
// * 和 & 是配套的操作符
}
// 指针的算数运算
void fun4();
void fun4()
{
// 指针的算术运算
int a = 10;
int *p = &a;
p++; // 向高位移动4个字节
p--; // 向低位移动4个字节
// 指针移动几个字节,取决于指针的类型
// 指针的算数运算
int *p2 = &a;
printf("%d\n", *p2);
p2++; // 向高位地址移动四个字节
printf("p++ = %d\n", *p2);
p2--; // 向低位地址移动四个字节
printf("p-- = %d\n", *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\n", *point);
point = &num2;
printf("point = %d\n", *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\n", element1, element11);
// 指针可以当数组名使用,数组名也可以当指针来使用
int *p = array;
printf("%d %d\n", p[0], array[0]);
printf("%d %d\n", *p, *array);
// 指针与数组的区别
// 1. 指针的大小只取决于操作系统,与指针的类型无关。数组的大小与数组元素类型和数组元素个数有关
// 2. 数组名是常量地址,不能重指向,指针可以重指向
// 思考?
// 使用指针能否计算出数组元素个数?
// 答案:使用指针可以计算出字符串的长度,因为有结束标示‘\0’,不可以计算其它类型的数组长度,没有结束标示
// 使用不同类型的指针指向数组,不会崩溃,但是得到的结果不是错误的
short a[4] = {3 , 7 , 9 , 1};
int *p1 = a;
char *p2 = a;
}
// 指针与字符串
void fun7();
void fun7()
{
// C语言使用字符数组保存字符串
char string[10] = "iPhone";
// string为数组名,同时也是数组的首地址。
char *p = string;
// 如何使用p输出字符串。
printf("%s\n", p);
// 字符指针可以操作单个字符,也可以操作字符串。
char str[] = "Macbook Pro";
char *str1 = "MacBook Air";
// 字符数组中的字符可以修改
str[0] = 'm';
printf("str = %s\n", str);
// 指针指向的字符串不可以修改,因为字符串处在常量去,但是指针可以重指向
// str1[0] = 'm'; // 不可以修改
str1 = "Mac Pro";
printf("str1 = %s\n", str1);
}
// 练习1
void pratice1();
void pratice1()
{
// 使用指针计算计算字符串的长度
char string[] = "iPhone";
char *p = string;
int count = 0;
while (*p++ != '\0') {
count ++;
}
printf("字符串长度是:%d", count);
}
// 指针数组
void fun8();
void fun8()
{
// 指针数组
char *string[] = {"iOS", "Android", "WP8"};
// 循环取值
for (int i = 0; i < 3; i++) {
printf("%s\n", string[i]);
}
}
// 指针与函数
void change(int *a, int *b);
void change(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void fun9();
void fun9()
{
// 使用函数,交换两个实参的值
int a = 10, b = 20;
printf("交换前:a = %d b = %d \n", a, b);
change(&a, &b);
printf("交换后:a = %d b = %d \n", a, b);
}
int main(int argc, const char * argv[])
{
// 注意:*p :其中的‘*’是有两层意义的
// 在定义指针变量的时候,‘*’的作用是告诉编译器,这就是一个指针
// 在通过指针取值的时候,‘*’的作用是取值运算符,是访问内存地址为p的存储区域
// '*'的不同作用:
// 指针变量定义时: 只起修饰作用,告诉编译器p是指针
// 指针变量取值时: 访问内存地址为p的存储区域
// 简单总结
// 指针变量是存放地址的变量,指针变量的赋值,意味着指针的重指向。
// 数组名代表数组的首地址,而且是常量地址,不可以修改。
// 函数调用时,形参拷贝了实参的值。
return 0;
}