概述
P124. 指针-2-基本类型指针
说明:
本篇记录的是自学C语言的相关过程记录,参考资料是B站郝斌老师的C语言自学教程。本人之前学过一点python,但是觉得C语言还是有必要学一下的。因为刚开始学C语言,所以本篇文章会不断更新。
因为是学习记录,所以条理可能并不是很清晰,后续感觉学的差不多的时候会重新整理一下。
指针的重要性:
表示一些复杂的数据结构;
快速地传递数据;
使函数返回一个以上的值(详情见最后);
能直接访问硬件;
能够方便地处理字符串;
是理解面向对象语言中引用的基础;
总结:指针是 C 语言的灵魂。
指针的定义:
地址:
内存单元的编号。
从零开始的非负整数。
范围:4G(2009年)
指针:
指针就是地址,地址就是指针;
指针变量就是存放地址的变量;
指针的本质就是一个操作受限的非负整数(指针只能进行减法计算,不能进行加、乘、除);
指针和指针变量是不同的概念;
指针的分类1 —— 基本类型指针:
int * p;
int i = 3;
p = &i;
// int * p; 等价于 int *p; 也等价于 int* p;
p 保存 i 的地址
因此 p 指向 i
*p 就是 i
基本类型指针常见错误:
示例1:(更改了以垃圾值为地址的变量的值)
# include <stdio.h>
int main(void)
{
int * p;
int i = 5;
*p = i; // error 以垃圾值为地址的变量赋值为i
printf("%dn", *p);
return 0;
}
/*
p 没有初始化,所以 *p 指向的是以 垃圾值p(没有初始化,那么 p 就默认是垃圾值) 为地址的变量。
因此 *p = i,就是说把 i 的值 赋给了 以 垃圾值p 为地址的变量。
*/
示例2(指针变量的类型和值的类型不一致、没有内存单元的控制权):
# include <stdio.h>
int main(void)
{
int i = 5;
int * p;
int * q;
p = &i;
*q = p; //error 语法编译出错(数据类型不一致),*q类型为int, p的类型为 int *
// *q = *p; //那么该错误和示例1一样。
// p = q; // 把p的值赋值为q的值,q的值是个垃圾值,所以p的值也是个垃圾值。
printf("%dn", *q);
/*
q 的空间是本程序的,所以可以读写q的内容。但是如果q是垃圾值,则本程序不能读写 *q 的内容。也就是说此处只能 printf("%dn", q); 而不能 printf("%dn", *q);
因为此时 *q 多代表的内存单元的控制权并没有分配给本程序。
*/
return 0;
}
/*
普通变量 i 和 指针变量 p, q;
i 的初始化值为5,i 的地址赋值给 指针变量p --> *p = i
q没有初始化,所以q是个垃圾值,所以 *q = p 就是把p的值(也就是 i 的地址) 赋值给 以垃圾值q为地址的变量。
所犯错误和示例1类似,但是不太一样的地方是:上面编译不会出错,这里编译会出错,原因是:
*q是q指向的变量,其类型为 int类型,而 p的类型为 int *,也就是说*q和p在类型上不一致,所以编译会出错。
*/
示例2:经典的指针程序(互换两个数字):
以下代码不能完成互换的功能:
# include <stdio.h>
void huhuan(int * p, int * q)
{
int * t;
t = p;
p = q;
q = t;
/*
这里互换的是指针变量 p 和 q 的值,也就是说改变了 p 和 q 的指向;
也就是说:
*p = x; *q = y;
换成了
*p = y; *q = x;
其实 x 和 y 的值并没有被互换。
*/
return;
}
int main(void)
{
int a = 3;
int b = 5;
huhuan(&a, &b);
printf("a = %d , b = %dn", a, b); // 因为 huhuan()没有实现两个形参的值之间的互换,所以a和b依旧是原来的a=3; b=5;
return 0;
}
以下脚代码实现互换的功能:
# include <stdio.h>
void huhuan(int * p, int * q)
{
int t;
t = *p;
*p = *q;
*q = t;
/*
这里互换的是以指针变量的值为地址的变量的值,就是说:
p指向a,q指向b,所以 *p 就是 a,*q 就是 b。
也就是说:
t = *p;
*p = *q;
*q = t;
可以换成:
t = a;
a = b;
b = t;
需要注意的是由于 p 是 int * 类型,所以 *p 就是 int 类型。
因为要保持数据类型的一致性,所以 t 的类型要和 *p *q 一致,因此 t 的类型是 int 类型。
*/
return;
}
int main(void)
{
int a = 3;
int b = 5;
huhuan(&a, &b);
printf("a = %d , b = %dn", a, b);
return 0;
}
*
的含义:
乘法运算;
定义指针变量(例如:
int * p
);// 定义了一个名字为
p
的变量,int *
表示p
只能存放int
类型变量的地址。指针运算符;
// 该运算符放在已经定义好的指针变量的前面。 如果
p
是一个已经定义好的指针变量,则*p
表示 以p
的内容为地址的变量。
指针使函数返回一个以上的值:
如何通过被调函数修改主调函数的普通变量的值?(或者说:如何让函数返回一个以上的值?)
- 实参必须为该普通变量的地址;
- 形参必须为指针变量;
- 在被调函数中通过
*形参名 = ...
的方式来修改主调函数相关变量的值;
# include <stdio.h>
// 通过指针使函数返回一个以上的值。
void g(int * p, int * q)
{
*p = 1;
*q = 2;
}
int main(void)
{
int a = 3, b = 5;
g(&a, &b);
printf("a = %d, b = %dn", a, b);
return 0;
}
最后
以上就是活力老师为你收集整理的C语言自学记录-Class9-指针(重点)-2-基本类型指针P124. 指针-2-基本类型指针的全部内容,希望文章能够帮你解决C语言自学记录-Class9-指针(重点)-2-基本类型指针P124. 指针-2-基本类型指针所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复