slide1 n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
变量的地址及指针的概念 PowerPoint Presentation
Download Presentation
变量的地址及指针的概念

Loading in 2 Seconds...

play fullscreen
1 / 22

变量的地址及指针的概念 - PowerPoint PPT Presentation


  • 114 Views
  • Uploaded on

第七章 指针. 变量的地址及指针的概念. 指向简单变量的指针变量. 指向一维数组的指针变量. 变量的地址及指针的概念. 变量的地址. 变量代表了内存中的存储单元. 2000. 12. 内存单元按字节编号. a. 12. 200 2. 变量类型不同,占据的字节数 不同. 200 4. 5. char :. int :. 1 字节. 4 字节. float :. 4 字节. b. 5. 变量所占内存单元首字节的 地址就是变量的地址. 200 6. 200 8. 2.4. void main( ). 2 .4. x.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about '变量的地址及指针的概念' - galia


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide1

第七章 指针

  • 变量的地址及指针的概念
  • 指向简单变量的指针变量
  • 指向一维数组的指针变量
slide2
变量的地址及指针的概念
  • 变量的地址
  • 变量代表了内存中的存储单元

2000

12

  • 内存单元按字节编号

a

12

2002

  • 变量类型不同,占据的字节数
  • 不同

2004

5

char:

int:

1字节

4字节

float:

4字节

b

5

  • 变量所占内存单元首字节的
  • 地址就是变量的地址

2006

2008

2.4

void main( )

2.4

x

2010

{ int a,b;

float x;

char c;

scanf("%d,%d", &a, &b);

17

c

2012

17

x=(float)a/b;

地址

c=a+b;

12,5

……}

slide3
变量的地址及指针的概念
  • 变量的地址
  • 变量代表了内存中的存储单元

2000

12

  • 内存单元按字节编号

a

12

2002

  • 变量类型不同,占据的字节数
  • 不同

2004

5

char:

int:

1字节

4字节

float:

4字节

b

5

  • 变量所占内存单元首字节的
  • 地址就是变量的地址

2006

2008

2.4

void main( )

2.4

x

2010

{ int a,b;

float x;

char c;

scanf("%d,%d", &a, &b);

17

c

2012

17

x=(float)a/b;

地址

c=a+b;

12,5

……}

slide4
变量的地址及指针的概念
  • 访问变量的方式

如何定义指针变量

如何使一个指针变量指向另一个变量

如何使用指针变量间接访问变量

  • 直接访问

2000

12

直接按变量名存取变量值

a

12

  • 间接访问

2002

变量地址存放在一个变量中,通过访问这个变量来存取变量的值

2004

5

b

5

2006

  • 重要概念
  • 指针

变量的地址

2008

2.4

2.4

存放指针的变量

x

  • 指针变量

2010

如:

p是指针变量

17

c

2012

17

p中存放变量a的地址

3000

地址

p指向a

p

&a

2000

slide5
指向简单变量的指针变量
  • 指针变量的定义
  • 通过指针变量
  • 间接引用变量

类型名 *指针变量名1, *指针变量名2, ...;

*

:间接访问运算符

  • 类型名

(float、int、char等)

*i_p:

指定指针变量可以指向的变量类型。

访问指针变量i_p所指向的变量

  • *

i

0

3

指针变量的标志

指针变量i_p指向变量i

……

void main( )

如:

int *i_p, *j_p;

{ int i=0,*i_p;

float *t;

i_p

&i

  • 给指针变量赋地址值

i_p=&i;

*i_p=3;

:取址运算符

&

i=3;

…… }

slide6
程序举例

例2: 写出程序的运行结果

110

例1: 以下程序段的输出结果是.

……

……

int k=2, m=4, n=6;

int *var, ab;

int *pk=&k,*pm=&m,*p;

ab=100;

p=&n;

var=&ab;

*p=*pk*(*pm);

ab=*var+10;

cout<<n<<endl;

……

cout<<*var<<endl;

k

m

n

……

 *pk*(*pm)

2

4

6

8

=k*m

var

ab

 *p=8

100

110

&ab

&k

&m

&n

8

pk

pm

p

slide7
程序举例

例3 填空。该程序的功能是输入两个整数,然后按从小到大的顺序输出。

#include <iostream.h>

void main( )

{ int a, b;

int *maxp, *minp;

cin>>a>>b;

minp

=a<b?&a:&b;

a>b?&a:&b;

maxp=e

cout<<*minp<<*maxp;

}

slide8
程序举例

例4:写出程序的运行结果。

a

b

w

值传递

#include <iostream.h>

&x

&y

4.0

void fun(float *a, float *b)

{ float w;

*a=*a+*a;

y

x

2.0

3.0

3.0

4.0

4.0

w= *a;

*a= *b;

*b= w; }

px

py

&x

&y

void main( )

{ float x=2.0, y=3.0;

3, 4

float *px=&x, *py=&y;

fun(px, py);

用指针作形参可以将子函数的处理结果传递回主函数

cout<<x<<','<<y<<endl; }

slide9

a

x

y

t

a

b

b

t

y

x

程序举例

例5:写出程序的运行结果。

#include <iostream.h>

#include <iostream.h>

void swap(int x, int y)

void swap(int *x, int *y)

形参及

内部变量

形参及

内部变量

{ int t;

{ int t;

实参

t=*x;

t=x;

5

5

&a

10

10

5

*x=*y;

x=y;

*y=t; }

10

10

&b

5

5

y=t; }

10

void main( )

void main( )

5

5

{ int a=5, b=10;

{ int a=5, b=10;

cout<<a<<','<<b<<endl;

cout<<a<<','<<b<<endl;

swap(&a,&b);

swap(a, b);

cout<<a<<','<<b<<endl; }

cout<<a<<','<<b<<endl; }

5,10

5,10

5,10

10,5

slide10

x

y

t

y

t

x

b

b

a

a

程序举例

例5:写出程序的运行结果。

#include <iostream.h>

#include <iostream.h>

void swap(int *x, int *y)

void swap(int *x, int *y)

形参及

内部变量

形参及

内部变量

{ int *t;

{ int t;

t=x;

t=*x;

5

&a

5

&a

10

&b

x=y;

*x=*y;

y=t; }

*y=t; }

10

&b

10

&b

5

&a

void main( )

void main( )

&a

5

{ int a=5, b=10;

{ int a=5, b=10;

cout<<a<<','<<b<<endl;

cout<<a<<','<<b<<endl;

swap(&a,&b);

swap(&a,&b);

cout<<a<<','<<b<<endl; }

cout<<a<<','<<b<<endl; }

5,10

5,10

10,5

5,10

slide11
指向一维数组的指针变量

例:对数组进行输入输出。

  • 指向数组元素的指针变量

void main()

  • 指针变量的定义

{ int a[5], i, *pa;

  • 数组首地址赋给指针变量

pa=&a[0];

a

  • 指针变量指向数组元素

for(i=0; i<5; i++)

scanf("%d", pa+i);

若pa指向a[0],

for(i=0; i<5; i++)

则pa+i指向a[i]。

printf("%d ", *(pa+i); }

  • 通过指针访问数组元素

&a[0]

pa

a[0]

a[1]

由于pa+i指向a[i],

pa+1

a[2]

……

则 *(pa+i)间接访问a[i]。

a[3]

a[4]

pa+4

slide12
指向一维数组的指针变量
  • 访问数组元素的方式
  • 指针
  • 下标法

p[i]

(直接访问)

a[i]

若p指向a[0]

则 *(p+i)表示间接访问a[i]

  • 数组名

若p指向a[i]

则 *p表示间接访问a[i]

*(a+i)

a[i]

&a[0]

p

a[0]

a

a[0]

a[1]

a[1]

p+1

a+1

a[2]

a[2]

……

……

a[3]

a[3]

a[4]

a[4]

p+4

a+4

slide13
指针变量的运算

以整型数组为例:

指向下一个数组元素。

指针变量加一

指向上一个数组元素。

指针变量减一

a[0]

2000

void main( )

pa+n的地址:

pa+n*d

d与类型有关:

2004

a[1]

{ int a[5], *pa=a;

pa

pa++;

2008

a[2]

2016

2004

2008

2000

pa+=3;

int:

4

pa-=2;

float:

4

a[3]

2012

…… }

char:

1

a[4]

2016

slide14
指针变量的运算

以整型数组为例:

两个指针变量相减

表示两个指针之间相隔的元素的个数。

a[0]

2000

p1

p1=&a[1];

p2=&a[4];

2004

a[1]

&a[1]

3

p2-p1的值是

2008

a[2]

两个指针变量可以进行关系运算

a[3]

2012

p1=&a[1];

p2=&a[4];

p2

p1<p2的值是

1

a[4]

2016

&a[4]

p1==p2的值是

0

slide15

程 序 举 例

例6:写结果。

pa

#include <stdio.h>

void main()

{

char a[ ]="Stu-Dent", *pa;

for(pa=a; *pa!='\0'; pa++)

if(*pa>='A'&&*pa<='Z')

*pa=*pa+32;

else if(*pa>='a'&&*pa<='z')

*pa=*pa-32;

puts(a);

}

a[0]

S

&a[0]

s

&a[7]

&a[5]

&a[6]

&a[1]

&a[8]

&a[3]

&a[2]

&a[4]

a[1]

t

T

a[2]

u

U

a[3]

-

a[4]

D

d

a[5]

e

E

a[6]

n

N

a[7]

t

T

a[8]

\0

sTU-dENT

slide16

程 序 举 例

例7:写结果。

s

#include <iostream.h>

void main()

{

char b[4]="ABC", *s;

s=b;

do

{

cout<<*s%10;

s++;

}

while(*s!=0);

}

&b[0]

b[0]

&b[2]

&b[3]

A

&b[1]

b[1]

B

b[2]

C

b[3]

\0

5

6

7

slide17

程 序 举 例

例8:写结果。

s

#include <stdio.h>

void main()

{

char b[4]="ABC", *s;

s=b;

do

{

puts(s);

s++;

}

while(*s!=0);

}

&b[0]

b[0]

&b[2]

&b[3]

A

&b[1]

b[1]

B

b[2]

C

b[3]

\0

ABC

BC

C

slide18

程 序 举 例

例9:输入1 2 3 4 5 6 7 8,写出以下程序的运行结果。

p

#include <stdio.h>

#define M 8

a[0]

1

&a[0]

8

void main( )

p+1

a[1]

2

7

{ int a[M], i, j, t, *p=a;

p+2

a[2]

3

6

for(i=0; i<M; i++)

i

j

p+3

a[3]

4

5

scanf("%d", a+i);

0

7

p+4

a[4]

5

4

i=0; j=M-1;

1

6

p+5

a[5]

6

while (i<j)

3

2

5

{ t=p[i];

p[i]=[j];

p+6

a[6]

7

3

4

2

4

3

p[j]=t;

i++; j--; }

a[7]

p+7

8

1

for(i=0; i<M; i++, p++)

87654321

printf("%3d", *p);

}

slide19
程 序 举 例

例11:写结果

#include <stdio.h>

a

-5

b

-12

c

-7

void sub(int x, int y, int *z)

{ *z=y-x; }

y

5

z

void main( )

x

10

&a

{ int a, b, c;

y

-5

z

sub(10, 5, &a);

x

7

&b

sub(7, a, &b);

y

-12

z

sub(a, b, &c);

x

-5

&c

printf("%d,%d,%d\n",a, b, c);

}

-5,-12,-7

slide20

程 序 举 例

例12:写结果

#include <stdio.h>

void main()

{

int a[ ]={1,2,3,4,5,6,7,8,9,10};

int *p;

p=a;

printf("%d\n", *p+9);

}

#include <stdio.h>

void main()

{

int arr[ ]={3,2,5,6,7,4};

int *p=arr;

p++;

printf("%d\n", *(p+3));

}

10

7

slide21

指向一维数组的指针变量

  • 指向数组的指针变量作函数参数
  • 形参是指针变量,实参是指针变量。
  • 形参是指针变量,实参是数组名。
  • 形参是数组名,实参是数组名。
  • 形参是数组名,实参是指针变量。
slide22
形参是指针变量实参是数组名举例

例10:读程序,写结果。

p

#include <iostream.h>

a[0]

void main( )

0

&a[0]

{ int a[5], i, t;

a[1]

1

p+1

int sub(int *, int );

a[2]

4

p+2

for(i=0; i<5; i++)

a[3]

9

p+3

a[i]=i*i;

a[4]

16

p+4

t = sub(a,5) ;

cout<<t<<endl; }

int sub(int *p, int n)

30

{ int i, s=0;

for(i=0; i<n; i++)

s+=*(p+i);

return s; }