C语言二刷第六天:指针(mooc视频;老师:翁恺)
2019-08-31 22:38
369 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44788228/article/details/100169290
写在前面:
int *p;写成int* p;会更好理解:定义的p是一个int*类型的指针。
有些编译器支持int* p=(int*)a;强制转换(开发时不要这么写,仅限于理解方便)
*p表示被p指针指向的变量。
p表示地址值,和&a是同一种类型,可以进行赋值操作。
9.1.1
- &获得变量的地址,它的操作数必须是变量。
- 地址的大小是否与int相同取决于编译器(想要输出地址还是用%p,不能用%d)
int i; printf(“%p”,&i);
- &(i++),&(++i),&(a+b)不能取地址
- 先定义的变量地址值高,自上而下存(堆内存)。
- 数组名==&数组名
-
9.1.2
- &与*起相反作用,&取地址值,*取地址对应的变量值。
- *是一个单目运算符,用来访问指针的值所表示的地址上的变量。
9.1.3
- 指针注意事项:
- 指针作为函数的参数时,调用函数时传入的值为其地址值。
- 在交换swap函数时,交换的不是地址值而是地址值所对应的变量。
-
[code]void swap(int &a,int &b)
是C++语言的写法,引用
-
[code]void swap(int *a,int *b)
是C语言的写法
- 指针应用场景:
- 函数返回多个值,某些值就只能通过指针返回。传入的参数实际上是需要保存带回结果的变量。(函数中通过改变指针对应的变量,然后用来在主函数中调用指针来寻找修改后的变量,以达到返回多个值的效果)例如:swap(int *a,int*b)
- 函数返回运算的状态,结果通过指针返回。(用-1或0表示出错)
[code]#include<stdio.h> int divide(int a,int b,int* result); void main(){ int a=5; int b=2; int c; if(divide(a,b,&c)){ printf("%d",c); }else{ printf("除数不能为零!"); } } int divide(int a,int b,int* result){ if(b==0){ return 0; }else{ *result=a/b; return 1; } }
以上程序好像指针在暗中把函数操作了一遍,返回值可以用来判断是否触发函数。
9.1.4(数组参数)
- 以下四种函数原型是等价的:
int sum(int *ar,int n);
int sum(int *,int);
int sum(int ar[],int n);
int sum(int [],int);
- 数组变量是特殊的指针
1.数组变量本身表达地址,所以:int a[10]; int* p=a;//无需用&取地址
2.但数组单元表达的是变量,需要用&取地址:a==&a[0]
3.[]运算符可以对数组做,也可以对指针做。:p[0]<==>a[0]
4.数组变量是const常量指针,所以不能被赋值。:int a[] <==> int * const a=...(意思是:只要数组一经定义,其指针就已固定无法更改)
所以两个数组之间不能做赋值:a[]=b[](error!)
5.int *p=a[2]; 意思是p指向a数组的角标为2的元素。p[-1] 意思是基于刚才的2角标向前一个角标,即p[-1]==a[1]
9.1.5
- const int *p1 =&i; int const * p2=&i; 这两种const在*前面表示,不能通过修改*p去赋值。*p=26(×)
- int *const p3=&i; 表示p3指向 i 的事实不可被改变,p3不能指向别人了。p3可以通过*p3任意更改 i 的值(见:数组,指针的应用)
- 保护数组值:int sum(const int a [], int length);(保证数组内每一个值都不可被改变,只能通过初始化完成赋值)
9.2.1
- int *p; p+1:其意思是加上当前类型的一单位(例如:int加4个字节),在数组中即表示角标+1。
- *p++:用于数组的角标操作(比如:遍历)
9.2.2
- 动态分配内存:适用于C99之前还不知道数组大小时,定义的动态数组。
- #include<stdlib.h>
- (void *) malloc(number*sizeof(数据类型));
- 比如:int n; scanf("%d",&n); int *a=(int*) malloc(n * sizeof(int)); (需要输入n个学生的成绩)free(a);
相关文章推荐
- C语言二刷第八天:结构类型(mooc视频;老师:翁恺)
- C语言二刷第九天:程序结构(mooc视频;老师:翁恺)
- C语言二刷第七天:字符串(mooc视频;老师:翁恺)
- 听翁恺老师mooc笔记(5)--指针与数组
- 听翁恺老师mooc笔记(6)--指针运算
- 听翁恺老师mooc笔记(4)--指针的应用场景
- 听翁恺老师mooc笔记(3)--指针的定义
- 慕课网程序设计入门——C语言( 翁恺老师)学习笔记2、指针
- 听翁恺老师mooc笔记(16)--程序设计与C语言
- 听翁恺老师mooc笔记(8)--字符串2
- 套路还在——MOOC视频的指针
- 听翁恺老师mooc笔记(12)--结构中的结构
- 听翁恺老师mooc笔记(2)-第一个程序--&运算符
- 听翁恺老师mooc笔记(15)--文件的输入与输出
- 听翁恺老师mooc笔记(13)--类型定义和联合
- mooc 翁恺老师第二周作业
- 听翁恺老师mooc笔记(10)--结构
- 3G手机Android应用开发视频教程_黎活明老师的视频(第六天课程)总共有八天课程
- C语言中的指针和内存泄漏(内附20天C语言速成视频)
- 慕课网程序设计入门——C语言( 翁恺老师)学习笔记1、tips