版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
指
针回顾数组的存储机制数组的定义和使用数组的初始化二维和多维数组目标理解指针的意义掌握指针变量和指针运算符的使用掌握指针与数组的关系掌握内存分配什么是指针?指针是一个变量,它包含另一个变量的内存地址使用指针可以间接访问数据项的值指针可以指向基本数据类型的变量(如int、char和double等)或者数组指针可以用来做什么?从函数中返回多个值从一个函数向另一个函数传递数组和字符串通过移动指针操作数组分配内存并对其进行访问指针变量指针声明包括类型和变量名,变量名的前面有一个*type
*name;注意:这里type是任何一种有效的数据类型,name是指针变量名.例如:int
*var2;var2指针运算符&是一元运算符,它返回操作数的内存地址
int
var1;int
*var2
=
&var1;int
&a=var1;*是&的反运算符,它也是一元运算符,返回指针指向的内存位置中的值int
temp
=
*var2;给指针赋值2-1指针变量使用之前一定要赋值.例如:int
var,
*ptr_var,*ptr_var2;通过&
运算符为指针赋值ptr_var
=&var;通过另一个指向相同类型数据项的指针变量对指针进行赋值ptr_var2
=
ptr_var;给指针赋值2-2通过指针为变量赋值ptr_var
=&var;*ptr_var
=
10;如果ptr_var指向var,则把10赋给var。也可以对指针赋”空”值:ptr_var=0;
//NULL表示指针不指向任何变量.指针运算2-1指针只能进行加法和减法运算int
var,
*ptr_var;ptr_var
=&var;ptr_var
++;假定var存储在地址1000中,因为整数的长度是4个字节,ptr_var++的值将是1004指针运算2-2指针递增时,将指向其类型的下一个元素的内存位置,反之亦然操作意义++ptr_var或ptr_var++指向var
后面的下一个类型数据--ptr_var或ptr_var--指向var
前面的类型数据ptr_var
+
i指向var
后面的第i
个类型数据ptr_var
-
i指向var
前面的第i
个类型数据++(*ptr_var)或将var
的值加1指针比较前提:两个指针都指向相同类型的变量假设ptr_a
=1000和ptr_b
1004分别指向a和b操作意义ptr_a
<ptr_b如果a存储在b的前面则返回trueptr_a
<=ptr_b如果a存储在b的前面,或两个指针指向同一位置则返回trueptr_a
==ptr_b如果两个指针指向同一位置则返回trueptr_a
!=ptr_b如果两个指针指向不同位置则返回trueptr_a
==
NULL如果ptr_a是空值则返回true面试题1:以下代码中的两个sizeof用法有问题吗?#include
<stdio.h>#include
"iostream.h"void
UpperCase(
char
str[]
){ int
i;for(i=0;
i<sizeof(str)/sizeof(str[0]);
++iif(
'a'<=str[i]
&&
str[i]<='z'
)str[i]-=('a'-'A');//由小写转大写}void
main(){char
str[]
=
"aBcDefg";cout<<"str字符长度为:"<<sizeof(str)/sizeof(str[0])<<endl;//是数组的大小6UpperCase(
str);cout
<<
str
<<
endl;}//面试题1
分析:
#include<stdio.h>#include
"iostream.h"void
UpperCase(
charstr[])//将str中的小写字母转换成大写字母{ int
i;for(i=0;i<sizeof(str)/sizeof(str[0]);++i)//是指针的大小4,只循环了4次。数组做参数,会退化为指针。可改为strlen(str),为5if(
'a'<=str[i]
&&
str[i]<='z'
)str[i]-=('a'-'A');//由小写转大写}void
main(){charstr[]
=
"aBcDefg";cout<<"str字符长度为:"<<sizeof(str)/sizeof(str[0])<<endl;//是数组的大小6UpperCase(
str);cout
<<
str
<<
endl;}面试题2:main(){int
a[][3]
=
{
1,2,3
,4,5,6};int
(*ptr)[3]
=a;printf("%d
%d
"
,(*ptr)[1],
(*ptr)[2]
);++ptr;printf("%d
%d"
,(*ptr)[1],
(*ptr)[2]
);}这段程序的输出是:2
3
5
62
3
4
54
5
0
0以上均不对指针与一维数组3-1数在C语言中数组名实际是一个指向数组中第一个元素的指针数组元素的地址可以用两种方式表示在数组元素前面加“&”符号&ary[2]数组名+下标ary
+
2或ary+i
这里i必须是整ary+i表示数组的第i个元素的地址*(ary+i)表示什么呢?指针与一维数组3-2下面程序说明了数组元素与其地址之间的关系:#include
<stdio.h>void
main(){static
int
ary[10]
=
{1,
2,
3,
4,
5,
6,
7,
8,
9,
10};int
i;for
(i
=
0;
i
<
10;
i
++){printf("\ni=%d,ary[i]=%d,*(ary+i)=%d",i,ary[i],*(ary
+i));printf("&ary[i]=
%X,ary+i=%X",&ary[i],ary+i);}}地址指针与多维数组二维数组可以定义为一个指向一组连续的一维数组的指针data_type (*ptr_var)
[expr];数组指针:Int
a[5][10];Int
(*b)[10];指针与多维数组int
a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};int
(*ptr)[4];
//声明1个指向有4个整形数数组的指针ptr=a;
ptr实际是指向数组第一行的地址ptr+1指向第二行*ptr实际是数组第一行第一个元素的地址*(ptr+1)第二行第一个元素的地址*(*ptr)实际是数组第一行第一个元素*(*(ptr+1))是第二行第一个元素*((*ptr)+2)实际是数组第一行第三个元素*(*(ptr+1)+2)是第二行第三个元素指针与字符串2-1字符串是一维数组数组名就是数组的首地址所以在输入字符串时可以不要地址:char
str[10];scanf(“%s”,str);分配内存2-1malloc()
需要头文件malloc.h分配指定字节数的内存,不清0free()释放内存calloc(
)分配指定变量类型及个数的内存,清0realloc(
)扩充内存使用,指定现有内存地址,希望分配的总字节数需要头文件stdlib.hmalloc()分配内存malloc()
是最常用的函数之一它允许从空闲内存池中分配内存malloc()
的参数是代表所需字节数的整数若有足够内存将返回一个指向所分配内存的起点的地址若没有足够内存将返回返回指针类型是void,要进行类型转换格式void
*malloc(size);或void
*malloc(n*sizeof(type))练习1:由键盘输入指定个数的几个整数,给它们分配内存,并按小到大排序存放。练习1
答案:#include
<stdio.h>#include
<malloc.h>int
main()
{int
*p,n,i,j,temp;printf("\n
Enter
number
of
elements
in
the
array:
");scanf("%d",&n);p=(int*)malloc(n*sizeof(int));if(p!=NULL){for(i=0;i<n;++i){printf("\n
Enter
element
no.
%d:
",i+1);scanf("%d",p+i);}for(i=0;i<n-1;++i)//需比较n-1
次for(j=i+1;j<n;++j)//每次需比较的个数if(*(p+i)>*(p+j)){temp=*(p+i);*(p+i)=*(p+j);*(p+j)=temp;}for(i=0;i<n;++i)printf("%d\n",*(p+i));free(p);p=NULL;return
0;}else{printf("\nMemory
allocation
failed.\n");return
1;}}分配内存排序free()函数3-1使用free()函数释放不再需要的内存void
free(void
*ptr);//ptr此时还是指向这片内存,但是这片内存已不可用了。prt=NULL;//让指针指向空,防止野指针ptr必须是通过malloc()、calloc()或realloc()分配的指针calloc()函数3-1calloc()与malloc()类似主要的区别是存储在已分配的内存空间中的值默认为零calloc()需要两个参数要分配内存的变量的个数每个变量的大小(字节数)void
*calloc(
size_t
num,
size_t
size
);calloc()函数3-2#include
<stdio.h>#include
<stdlib.h>int
main()
{float
*calloc1,
*calloc2;int
i;calloc1
=
(float
*)
calloc(3,
sizeof(float));calloc2
=
(float
*)calloc(3,
sizeof(float));if(calloc1!=NULL
&&
calloc2!=NULL)
{for(i=0
;
i<3
;
i++){*(calloc1+i)
=
i;*(calloc2+i)
=
i;}for(i=0
;
i<3
;
i++)
{printf("\ncalloc1[%d]
holds
%07.5f
",
i,
calloc1[i]);printf("\ncalloc2[%d]
holds
%07.5f
",
i,
*(calloc2+i));}free(calloc1);free(calloc2);calloc1=NULL;calloc2=NULL;return
0;}else
{printf("Not
enough
memory
\n");return
1;}}定义分配判断释放realloc()函数3-1为已经分配的内存重新分配空间并复制内容realloc()函数有两个参数已分配的内存地址重新分配的字节数注意:若重新分配字节数是0,则释放内存.void
*realloc(
void
*ptr,size_t
size);例如:a=(int
*)calloc(5,sizeof(int));//分配内存
a=(int
*)realloc(a,8*sizeof(int));//扩充分配realloc(a,0);//释放内存realloc()函数3-2#include<stdio.h>#include
<stdlib.h>int
main(){int
*ptr;int
i;ptr
=
(int
*)calloc(5,sizeof(int));if(ptr!=NULL){*ptr
=
1;*(ptr+1)
=
2;ptr[2]
=
4;ptr[3]
=
8;ptr[4]
=
16;if(ptr!=NULL){ptr[5]
=
32;ptr[6]
=
64;for(i=0;i<7;i++){printf(“ptr[%d]:%d\n",
i,ptr[i]);}realloc(ptr,0);
/*
free(ptr);*/prt=NULL;return
0;}}ptr
=
(int
*)realloc(ptr,
}7*sizeof(int));这里共分配了7个空间。如果多用了则会出错。定义分配判断释放再分配练习1:下面的代码存在什么问题?#include
"stdio.h"main(){char
*p;gets(p);/*char
*p="aaa";gets(p);//*/Puts(p);}练习1:#include
"stdio.h"main(){/*
p的所指向的内存还没确定,此时如果给这个内存赋值会出错
char
*p;gets(p);//*//*
p是常量指针,其内容不可改变
char
*p="aaa";gets(p);//*/char
a[5];
char
*p
=a;gets(p);puts(p);}分析1:void
main(){int
a1
=1;int
array[2]
=
{2,
1};int*p1
=
array;*p1++;++*p1;//取出内容,指针++//
++(*p1);}分析2://方法一误例/*void
GetMemory(char*
psz,
int
nSize){psz
=
(char*)malloc(nSize*sizeof(char));nSize
=
200;}*///方法二误例char*
GetMemory(int
nSize){char
psz[100];return
psz;}voidmain(){char*
pszPrint
=
0;int
nSize
=
100;GetMemor
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河北省涞水波峰中学高三3月化学专练35
- 兰大《会计学原理》离线作业
- AI和销售线索营销进阶报告
- 急救技能大赛护理急救知识试题600题
- Lesson33OutoftheDarkness(冲出黑暗)英语教学讲稿
- 大学物理@热力学第一定律1
- 2024年运城办理客运从业资格证2024年试题
- 中医院医疗器械购买合同书2024年
- 2024年中山客运从业资格证考试培训试题和答案
- 2024年水果采购合同模板
- 期中测试卷-2024-2025学年统编版语文一年级上册
- 人教版一年级数学上册《第一、二单元测试卷》(附答案)
- 上市公司无形资产管理办法
- 人教版(2024新版)八年级上册物理第二章2.5《跨学科实践:制作隔音房间模型》教学设计
- 2024年济南轨道交通集团限公司招考(75名)易考易错模拟试题(共500题)试卷后附参考答案
- 计算机应用基础
- 第10课 读依依往事 解依依情思《往事依依》教学设计-七年级语文上册同步高效课堂(统编版)
- 第五单元 倍的认识(单元测试)-2024-2025学年三年级上册数学人教版
- 幼儿园中班数学活动《营救汪汪队》
- 2024年指标租赁协议模板(三篇)
- 2024年贵州黔东南州直事业单位遴选工作人员42人历年高频考题难、易错点模拟试题(共500题)附带答案详解
评论
0/150
提交评论