指针笔记及思维导图


运算符&


取地址符,用来取操作数的地址
是scanf("%d", &i);里的&
获取变量的地址,操作数必须是变量
int i; printf("%x", &i);
地址的大小是否与int相同取决于编译器
int i; printf("%p", &i);


指针


就是保存地址的变量
int i; 普通变量
int* p = &i; 将 i 的地址赋值给p;
int* p,q; q是普通变量,p是指针
int *p,q; q是普通变量,p是指针 星号位置不影响


指针变量


变量的值是内存的地址
普通变量的值是实际的值
指针变量的值是具有实际值的变量的地址


作为参数的指针


void f(int *p);
在被调用的时候得到了某个变量的地址:
int i=0;f(&i);
在函数里面可以通过这个指针访问外面的这个 i ;


访问那个地址上的变量*


*是一个单目运算符,用来访问指针的值所表示的地址上的变量
可以做右值也可以做左值

int k = *p;
*p = k+1;

函数参数表中的数组实际上是指针


sizeof(a) == sizeof(int*)
可以用数组的运算符[]进行运算
以下四种函数原型是等价的

int sum(int *ar, int n);
int sum(int *, int);
int sum(int ar[], int n);
int sum(int [], int);

数组变量是特殊的指针


数组本身表达地址,所以
int a[10]; int* p=a; 无需用&取a的地址
但是数组的单元表达的是变量,需要用&取地址
a == &a[0]
[]运算符可以对数组做,也可以对指针做:
p[0] 等价于 a[0]
*运算符可以对指针做,也可以对数组做:
*a = 25;
数组变量是const的指针,所以不能被赋值
int a[] 等价于 int * const a


指针应用场景


1.交换两个变量的值
2.函数返回多个值,某些值就只能通过指针返回
2.1传入的参数实际上是需要保护带回的结果的变量
2.2函数返回运算的状态,结果通过指针返回
3.常用的套路是让函数返回特殊的不属于有效范围内的值来表示出错:0 或 -1


指针是const时


int *const q = &i; //q是const
*q = 26; // OK
q++; //ERROR

所指是const时


表示不能通过这个指针去修改那个变量(并不能使那个变量成为const)

const int *p = &i; (*p)是const的
*p = 26; //ERROR
i = 26; //OK
p = &j; //OK

下列四个定义的意思


int i; 普通变量
const int* p1 = &i; *p1是 const 
int const* p2 = &i; *p2是 const 
int *const p3 = &i; p3是const

转换


总是可以把一个非 const 的值转换成 const 的 如下:

void f(const int* x);
int a = 15;
f(&a); //OK
const int b = a;
f(&b); //OK
b = a+1; //ERROR!

当要传递的参数的类型比地址大的时候,这是常用的手段


指针加一的情况


给一个指针加 1 表示要让指针指向下一个变量

int a[10]; int *p = a[0]; *(p+1) ==> a[1]

如果指针不是指向一片连续分配的空间,如数组,则这种运算无意义


指针运算


这些算术运算可以对指针做
给指针加、减一个整数(+,+=,-,-=)
递增递减(++,–)


指针比较


<, <=, ==, >, >=, != 都可以对指针做
比较它们在内存中的地址
数组中的单元地址肯定是线性递增的


指针的类型


无论指向什么类型,所以的指针的大小都是一样的,因为都是地址
但是指向不同类型的指针是不能直接互相赋值的
这是为了避免用错指针


指针的用处


需要传入较大的数据做参数
传入数组后对数组做操作
函数返回不止一个结果
需要用函数来修改不止一个变量
动态申请的内存…

在这里插入图片描述

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言的第八章是关于指针的使用和相关概念的。同学们在学习这一章节时,可以使用思维导图作为学习工具来帮助理解和记忆。 首先,在思维导图的中央,可以写上章节的主题“C语言第八章-指针”。然后将主题分成几个不同的分支。 第一个分支可以是指针的基本概念和定义。在这个分支中,可以列出指针的定义和声明的语法,以及如何通过指针来访问和修改变量的值。此外,还可以介绍指针的运算符,如取址运算符(&)和解引用运算符(*)。 第二个分支可以是指针组的关系。在这个分支中,可以讨论指针组之间的相似性和差异性,以及如何使用指针来处理组元素,如指针的算术运算和指针组。 第三个分支可以是指针和函的关系。在这个分支中,可以介绍指针和函之间的关系,如指针作为函的使用以及函返回指针的情况。 第四个分支可以是指针和动态内存分配的关系。在这个分支中,可以探讨使用指针来动态分配和释放内存的方法,如malloc()和free()函的使用。 最后,可以在思维导图的边缘加入一些常见的问题和实例,以帮助同学们更好地理解和应用这些概念。同时,也可以在思维导图中添加一些关键的代码示例,以便同学们进行练习和巩固知识。 通过使用思维导图来整理和展示C语言第八章的内容,同学们可以更加清晰地理解和记忆相关概念,提高学习效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值