ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

翁恺老师C语言程序设计网课(9)

2021-01-28 12:59:24  阅读:193  来源: 互联网

标签:int 地址 free C语言 char ++ 网课 翁恺 指针


9.2.1 指针运算
9.2.2 动态内存分配

9.2.1 指针运算
指针加一,会发生什么?

char a[]={0,1,2,3,4,5,6}
char *p=ac;
printf("p的地址是%p\n",p);
printf("p+1的地址是%p\n",p+1);

输出
0xbffbbd5e
0xbffbbd5f
当我们把char换成int时,输出
0xbffbad2c(c在十六进制中表示12)
0xbffbad30(进位了)
因为sizeof(char)=1,sizeof(int)=4,可见对指针+1会让指针指向下一个单元。如果输出*(p+1)得到1,也就是从ac[0]跳到了ac[1]。
注意是*(p+1)而不是*p+1,因为*号是单目运算符,优先级高。
由此可以猜测如果指针不是指向一片连续的空间(比如数组),那这种运算是没有意义的。

这种运算可以+,+=,-,-=,++,–,指针相减(p1-p得到的是两个指针之间的距离,即地址差/sizeof(),int 和char结果都是一样的)
*p++:取出p所指的数据,之后顺便把指针移动到下一个位置。(++的优先级比*高,不过p++得到的是p之前的结果,这之前有提到过。)不需要括号,常常用于数组类连续空间。

p=ac;
while(*p!=-1)
{
	printf("%d\n",*p++);
}

在某些CPU上,*p++被直接翻译成一条指令,使得取得p地址内的值之后,p指针++。
另外,>,>=,<,<=,!=都可以对指针做,比较指针在内存中的地址。数组中单元的地址肯定是线性递增的。

0地址
有,但是通常不随便碰,所以你的指针最好不要有0值。
因此我们可以用0地址来表示特殊的事情:
1.返回的指针是无效的
2.指针没有真正被初始化(先初始化为0)
NULL是一个预定定义的符号,表示0地址,建议使用,因为有得便一起不接受用0来表示0地址。
所有指针大小都是一样的,不管指向什么类型,因为他们都是地址。但指向不同类型的指针之间不能互相赋值,避免用错。

指针的类型转换
void*表示不知道指向什么东西的指针,计算时与char*相同。
指针也可以转换类型

int *p=&i;void*q=(void*)p;

并没有改变p所指的变量的类型, 而是让后人用不同的眼光通过p看他所指的变量。(初学者可以不用做)
指针的用处
需要传入较大的数据时指针用作参数
穿如数组后对数组进行操作
函数返回不止一个结果
需要用函数来修改不止一个变量
动态申请的内存……

9.2.2 动态内存分配
输入数据时先读入个数n,再输入n个数,并且要记录每个数据
C99可以用变量做数组定义的大小。C99之前该怎么做?
动态内存分配

int *a=(int*)malloc(n*sizeof(int));

另:编译时输入man malloc可以查看使用方法

#include<stdlib.h>
{
	int n;
	int *a;
	scanf("%d",&n);
	a=(int*)malloc(n*sizeof(int));
	//用完之后
	free a;
}

向malloc申请的空间的大小是以字节为单位的
如果申请失败会返回0,或称作NULL
free():把申请的空间还给系统,只能还该空间的首地址。一定要还。
习惯养成:定义指针的时候就先初始为0
void *p=0;之后再free(p),不管有没有使用malloc,free()都没有问题。
常见问题就是申请了没有free,长时间运行内存逐渐下降。做大程序时问题显现出来。
新手:忘了
老手:找不到合适的free的时机
问题2:free了又free
问题3:地址变过了,直接去free()。
纸上得来终觉浅。

标签:int,地址,free,C语言,char,++,网课,翁恺,指针
来源: https://blog.csdn.net/jtwqwq/article/details/113176945

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有