嵌入式课程chapter7指针_第1页
嵌入式课程chapter7指针_第2页
嵌入式课程chapter7指针_第3页
嵌入式课程chapter7指针_第4页
嵌入式课程chapter7指针_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

针回顾数组的存储机制数组的定义和使用数组的初始化二维和多维数组目标理解指针的意义掌握指针变量和指针运算符的使用掌握指针与数组的关系掌握内存分配什么是指针?指针是一个变量,它包含另一个变量的内存地址使用指针可以间接访问数据项的值指针可以指向基本数据类型的变量(如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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论