C++課件-第五章-part1-指針_第1頁
C++課件-第五章-part1-指針_第2頁
C++課件-第五章-part1-指針_第3頁
C++課件-第五章-part1-指針_第4頁
C++課件-第五章-part1-指針_第5頁
已閱讀5頁,還剩501頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

C\C++程序設計大連理工大學軟件學院賴曉晨far.away@C\C++程序設計大連理工大學軟件學院1第五章指針與引用第一節(jié)指針的概念第二節(jié)指針在數(shù)組中的運算第三節(jié)動態(tài)存儲第四節(jié)const約束訪問第五節(jié)指針與函數(shù)第六節(jié)字符指針第七節(jié)函數(shù)指針第八節(jié)指針數(shù)組第九節(jié)主函數(shù)參數(shù)第五章指針與引用第一節(jié)指針的概念2第一節(jié)指針的概念指針是用來存放地址的特殊類型變量,每一種基本數(shù)據(jù)類型都有相應的指針類型。指針變量的值為內存地址。通常變量直接包含特定值,而指針則是包含特定值變量的地址。指針變量的定義語句,由數(shù)據(jù)類型后跟星號,再跟隨指針變量名組成。第一節(jié)指針的概念指針是用來存放地址的特殊類型變量,每一種基3內存單元由操作系統(tǒng)按字節(jié)編號,稱為地址一個對象占有內存的第一個字節(jié)的地址稱為對象的地址可以通過對象名或地址訪問對象數(shù)據(jù)對象有兩種訪問形式——讀和寫操作5.1.1內存訪問內存單元由操作系統(tǒng)按字節(jié)編號,稱為地址5.1.1內存訪4inta0X0066FDF4doubleb0X0066FDEC例如,有說明: inta; doubleb;內存分配inta0X0066FDF4doubleb5inta

0X0066FDF4doubleb0X0066FDEC內存分配變量a的地址例如,有說明: inta; doubleb;inta0X0066FDF4doubleb6inta

0X0066FDF4doubleb0X0066FDEC內存分配由類型符int解釋存儲數(shù)據(jù)例如,有說明: inta; doubleb;inta0X0066FDF4doubleb7例如,有說明: inta; doubleb;inta0X0066FDF4doubleb

0X0066FDEC內存分配變量b的地址例如,有說明:inta0X0066FDF4doub8例如,有說明: inta; doubleb;inta0X0066FDF4doubleb

0X0066FDEC內存分配由類型符double解釋存儲數(shù)據(jù)例如,有說明:inta0X0066FDF4doub9對于數(shù)據(jù)單元,名訪問就是操作對象的內容訪問形式分為“讀”和“寫”例如:inta,b;a=10;b=20;a=a+b;5.1.2名訪問對于數(shù)據(jù)單元,名訪問就是操作對象的內容例如:5.1.210對于數(shù)據(jù)單元,名訪問就是操作對象的內容訪問形式分為“讀”和“寫”例如:inta,b;a=10;b=20;a=a+b;intaintb建立內存對象對于數(shù)據(jù)單元,名訪問就是操作對象的內容例如:intai11對于數(shù)據(jù)單元,名訪問就是操作對象的內容訪問形式分為“讀”和“寫”例如:inta,b;a=10;b=20;a=a+b;寫操作intaintb1010對于數(shù)據(jù)單元,名訪問就是操作對象的內容例如:寫操作int12對于數(shù)據(jù)單元,名訪問就是操作對象的內容訪問形式分為“讀”和“寫”例如:inta,b;a=10;b=20;a=a+b;寫操作intaintb102020對于數(shù)據(jù)單元,名訪問就是操作對象的內容例如:寫操作int13對于數(shù)據(jù)單元,名訪問就是操作對象的內容訪問形式分為“讀”和“寫”例如:inta,b;a=10;b=20;a=a+b;

讀操作intaintb1020+2010對于數(shù)據(jù)單元,名訪問就是操作對象的內容例如:讀操作int14對于數(shù)據(jù)單元,名訪問就是操作對象的內容訪問形式分為“讀”和“寫”例如:inta,b;a=10;b=20;a=a+b;

寫操作intaintb1020+201030對于數(shù)據(jù)單元,名訪問就是操作對象的內容例如:寫操作int15程序被編譯后,系統(tǒng)對已聲明對象保存一張名表,登記它們對象的屬性<名字,類型,地址>C++允許通過名或地址(并根據(jù)類型)訪問對象

例如,有說明: doubleb;<b,double,0X0066FDEC>名字b所標識的浮點型對象5.1.3地址訪問程序被編譯后,系統(tǒng)對已聲明對象保存一張名表,登記它們對象的16程序被編譯后,系統(tǒng)對已聲明對象保存一張名表,登記它們對象的屬性<名字,類型,地址>C++允許通過名或地址(并根據(jù)類型)訪問對象

例如,有說明: doubleb;<b,double,0X0066FDEC>地址0X0066FDEC所指的浮點型對象程序被編譯后,系統(tǒng)對已聲明對象保存一張名表,登記它們對象的17

程序被編譯后,系統(tǒng)對已聲明對象保存一張名表,登記它們對象的屬性<名字,類型,地址>

C++允許通過名或地址(并根據(jù)類型)訪問對象

例如,有說明: doubleb;<a,int,0X0066FDF4>inta;<b,double,0X0066FDEC>名字a所標識的整型對象程序被編譯后,系統(tǒng)對已聲明對象保存一張名表,登記它們對象的18

程序被編譯后,系統(tǒng)對已聲明對象保存一張名表,登記它們對象的屬性<名字,類型,地址>C++允許通過名或地址(并根據(jù)類型)訪問對象

例如,有說明: doubleb;<a,int,0X0066FDF4>inta;<b,double,0X0066FDEC>地址0X0066FDF4所指的整型對象程序被編譯后,系統(tǒng)對已聲明對象保存一張名表,登記它們對象的19

程序被編譯后,系統(tǒng)對已聲明對象保存一張名表,登記它們對象的屬性<名字,類型,地址>C++允許通過名或地址(并根據(jù)類型)訪問對象

例如,有說明: doubleb;<a,int,0X0066FDF4><b,double,0X0066FDEC>取對象b的地址:

&b訪問對象b: b

*(&b)取對象a的地址:

&a訪問對象a: a

*(&a)取址運算符間址運算符程序被編譯后,系統(tǒng)對已聲明對象保存一張名表,登記它們對象的20例5-1測試對變量、常量的不同訪問形式#include<iostream.h>voidmain(){inta=451;constintmax=1000;cout<<a<<endl; cout<<(&a)<<endl;cout<<*(&a)<<endl;

cout<<&max<<endl;cout<<max<<endl;cout<<*(&max)<<endl; }例5-1測試對變量、常量的不同訪問形式#includ21例5-1測試對變量、常量的不同訪問形式#include<iostream.h>voidmain(){inta=451;constintmax=1000;

cout<<a<<endl; cout<<(&a)<<endl;cout<<*(&a)<<endl;

cout<<&max<<endl;cout<<max<<endl;cout<<*(&max)<<endl ;}輸出變量的值例5-1測試對變量、常量的不同訪問形式#includ22例5-1測試對變量、常量的不同訪問形式#include<iostream.h>voidmain(){inta=451;constintmax=1000;cout<<a<<endl;

cout<<(&a)<<endl;cout<<*(&a)<<endl;

cout<<&max<<endl;cout<<max<<endl;cout<<*(&max)<<endl; }輸出變量的地址例5-1測試對變量、常量的不同訪問形式#includ23例5-1測試對變量、常量的不同訪問形式#include<iostream.h>voidmain(){inta=451;constintmax=1000;cout<<a<<endl; cout<<(&a)<<endl;

cout<<*(&a)<<endl;

cout<<&max<<endl;cout<<max<<endl;cout<<*(&max)<<endl; }輸出變量的值例5-1測試對變量、常量的不同訪問形式#includ24例5-1測試對變量、常量的不同訪問形式#include<iostream.h>voidmain(){inta=451;constintmax=1000;cout<<a<<endl; cout<<(&a)<<endl;cout<<*(&a)<<endl;

cout<<&max<<endl;cout<<max<<endl;cout<<*(&max)<<endl; }輸出常量的地址例5-1測試對變量、常量的不同訪問形式#includ25例5-1測試對變量、常量的不同訪問形式#include<iostream.h>voidmain(){inta=451;constintmax=1000;cout<<a<<endl; cout<<(&a)<<endl;cout<<*(&a)<<endl;

cout<<&max<<endl;

cout<<max<<endl;cout<<*(&max)<<endl; }輸出常量的值例5-1測試對變量、常量的不同訪問形式#include26例5-1測試對變量、常量的不同訪問形式#include<iostream.h>voidmain(){inta=451;constintmax=1000;cout<<a<<endl; cout<<(&a)<<endl;cout<<*(&a)<<endl;

cout<<&max<<endl;cout<<max<<endl;

cout<<*(&max)<<endl;}輸出常量的值例5-1測試對變量、常量的不同訪問形式#includ27定義形式:

類型*標識符;指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”5.1.4指針變量與間址訪問定義形式: 類型*標識符;指針類型變量——能夠存28指針變量名

類型*標識符;定義形式:指針變量名 類型*標識符;定義形式:29指針類型說明符

類型*標識符;定義形式:指針類型說明符 類型*標識符;定義形式:30指針所指對象的類型(指針的關聯(lián))

類型*標識符;定義形式:指針所指對象的類型 類型*標識符;定義形式:31例如int*iptr;//iptr是指向整型對象的指針,可以存放一個整型變量的地址

char*s; //s是指向字符對象的指針double*dPtr; //dPtr是指向浮點對象的指針

類型*標識符;定義形式:例如 定義形式:32 一個*只能表示一個指針。int*ip,a;//a不是指針變量char*ip1,*ip2;定義形式: 一個*只能表示一個指針。int*ip,a;33 指向整型數(shù)的指針是包含該整型數(shù)地址的變量:int*ip;

指向字符的指針是包含該字符地址的變量:char*ip;

定義形式: 指向整型數(shù)的指針是包含該整型數(shù)地址的變量:int*ip34 指針是變量,需要賦值之后才能使用。&可以用來獲取變量的地址,指針變量用于存放地址。int*ip;inta=20;ip=&a;0000:F822200000:F822ipa指針賦值 指針是變量,需要賦值之后才能使用。&可以用來獲取變量的地址35 下列語句十分危險!#include<iostream.h>voidmain(){ int*p; *p=20;}???20???p指針賦值 下列語句十分危險!#include<iostream.36指針賦值inti=1;int*iPtr1,*iPtr2;char*cPtr;…iPtr1=&i; //合法iPtr2=iPtr1; //合法iPtr2=i;

//非法,i不是int*對象cPtr=iPtr1;

//非法,iPtr1不是char*對象i=iPtr1; //非法,iPtr1不是int對象指針賦值inti=1;37&取地址操作 *間址訪問操作例如 inta=3,b=4; floatc=4.5,d=8.6; chare='x',f='y'; int*pa=&a,*pb=&b; float*pc=&c,*pd=&d; char*pe=&e,*pf=&f;abcdef100610101014101810221023344.58.6xy&取地址操作 例如 int*pa=&a,38abcdef100610101014101810221023344.58.6xypapbpcpdpepf2000200420082012201620202024100610101014101810221023&a3paa,*pa&b4pbb,*pb&c4.5pcc,*pc&d8.6pdd,*pd&expee,*pe&fypff,*pfabcdef10061010101410181022102339 每個指針都有一個類型(void*除外),指針是變量,因此它與其他基本數(shù)據(jù)類型一樣,凡是可以聲明變量的地方,都可以聲明指針變量。它可以是全局、靜態(tài)全局、靜態(tài)局部和局部的。 每個指針都有一個類型(void*除外),指針是變量,因此它40 “*”放在可執(zhí)行語句中的指針之前,稱為間接引用操作符,可獲得由該指針指向的變量的內容?!?”放在指針定義中,稱為指針定義符。#include<iostream.h>voidmain(){ inta=20,*j; j=&a; cout<<j<<endl<<*j<<endl;}間接引用 “*”放在可執(zhí)行語句中的指針之前,稱為間接引用操作符,可獲41 區(qū)別以下幾個“*”表示的含義。#include<iostream.h>voidmain(){ int*p; inta=1*2; p=&a; *p=20; cout<<*p<<endl;}間接引用 區(qū)別以下幾個“*”表示的含義。#include<iost42 辨析 intb=5; int*p=&b; *p=&b;間接引用 辨析 intb=5;間接引用43指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:

inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;例:指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”i44指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:inta,b;

int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE0指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”i45指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE0指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”i46指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF4指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”i47指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF4*p1*p1指針p1所指的對象指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”i48指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:inta,b;int*p1,*p2;p1=&a;

p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF0*p1指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”i49指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:inta,b;int*p1,*p2;p1=&a;

p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF4*p1*p2*p2指針p2所指的對象0X0066FDF0指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”i50指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:inta,b;int*p1,*p2;p1=&a;p2=&b;a=10; //*p1=10b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF010*p1*p2指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”i51指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20; //*p2=20a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF010*p1*p220指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”i52指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;

a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF010*p1*p220+指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”i53指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;

a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF030*p1*p220+指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”i54指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF030*p1*p220間址訪問讀出變量p1的地址值查找該地址的存儲單元讀出數(shù)據(jù)指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”i55指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF030*p1*p220間址訪問讀出變量p1的地址值查找該地址的存儲單元讀出數(shù)據(jù)指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”i56指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF030*p1*p220間址運算(指針運算)指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”i57指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0例如:inta,b;int*p1,*p2;p1=&a;p2=&b;a=10;b=20;a=*p1+*p2;int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF030*p1*p220指針類型說明指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”i58指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”inta0X0066FDF4intb0X0066FDF0int*p20X0066FDE4int*p10X0066FDE00X0066FDF40X0066FDF030*p1*p220int*p1int*p2intaintb*p1*p2指針類型變量——能夠存放對象地址的變量,簡稱“指針變量”i59//例5-3間址訪問對象#include<iostream.h>voidmain(){inti,*p;p=&i;*p=5;cout<<i<<endl;cout<<*p<<endl;cout<<p<<endl;cout<<&i<<endl;}1.5.3指針變量與間址訪問//例5-3間址訪問對象1.5.3指針變量與間址訪60//例5-3間址訪問對象#include<iostream.h>voidmain(){inti,*p;

p=&i;*p=5;cout<<i<<endl;cout<<*p<<endl;cout<<p<<endl;cout<<&i<<endl;}1.5.3指針變量與間址訪問//通過指針變量間址訪問對象//例5-3間址訪問對象1.5.3指針變量與間址訪61//例5-3間址訪問對象#include<iostream.h>voidmain(){inti,*p;p=&i;*p=5;

cout<<i<<endl;cout<<*p<<endl;cout<<p<<endl;cout<<&i<<endl;}用變量名訪問對象1.5.3指針變量與間址訪問//例5-3間址訪問對象用變量名訪問對象1.5.362//例5-3間址訪問對象#include<iostream.h>voidmain(){inti,*p;p=&i;*p=5;cout<<i<<endl;

cout<<*p<<endl;cout<<p<<endl;cout<<&i<<endl;}通過指針變量間址訪問對象1.5.3指針變量與間址訪問//例5-3間址訪問對象通過指針變量1.5.3指針63//例3間址訪問對象#include<iostream.h>voidmain(){inti,*p;p=&i;*p=5;cout<<i<<endl;cout<<*p<<endl;

cout<<p<<endl;cout<<&i<<endl;}指針變量的值對象i的地址1.5.3指針變量與間址訪問//例3間址訪問對象指針變量的值1.5.3指針變量64//例3間址訪問對象#include<iostream.h>voidmain(){inti,*p;p=&i;*p=5;cout<<i<<endl;cout<<*p<<endl;cout<<p<<endl;

cout<<&i<<endl;}取對象i的直接地址值//例3間址訪問對象取對象i65//例3間址訪問對象#include<iostream.h>voidmain(){inti,*p;p=&i;*p=5;cout<<i<<endl;cout<<*p<<endl;cout<<p<<endl;cout<<&i<<endl;

cout<<&p<<endl;}思考//例3間址訪問對象思考66//例5-4交換指針值#include<iostream.h>voidmain(){inti1=10,i2=20,*p1,*p2,*p;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;p=p1;p1=p2;p2=p;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}

p110i1

p220i2

pinti1=10,i2=20,*p1,*p2,*p;//例5-4交換指針值p110i167//例5-4交換指針值#include<iostream.h>voidmain(){inti1=10,i2=20,*p1,*p2,*p;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;p=p1;p1=p2;p2=p;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}

p110i1

p220i2

pp1=&i1;p2=&i2;*p1*p2//例5-4交換指針值p110i168//例5-4交換指針值#include<iostream.h>voidmain(){inti1=10,i2=20,*p1,*p2,*p;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;p=p1;p1=p2;p2=p;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}

p110i1

p220i2

pcout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;*p1*p2Output*p1=10 *p2=20//例5-4交換指針值p110i169//例5-4交換指針值#include<iostream.h>voidmain(){inti1=10,i2=20,*p1,*p2,*p;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;p=p1;p1=p2;p2=p;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}

p110i1

p220i2

pp=p1;*p1*p2*pOutput*p1=10 *p2=20//例5-4交換指針值p110i170//例5-4交換指針值#include<iostream.h>voidmain(){inti1=10,i2=20,*p1,*p2,*p;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;p=p1;p1=p2;p2=p;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}

p110i1

p220i2

pp1=p2;*p1*p*p2Output*p1=10 *p2=20//例5-4交換指針值p110i171//例5-4交換指針值#include<iostream.h>voidmain(){inti1=10,i2=20,*p1,*p2,*p;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;p=p1;p1=p2;p2=p;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}

p110i1

p220i2

pp2=p;*p1*p*p2Output

*p1=10 *p2=20//例5-4交換指針值p110i172//例5-4交換指針值#include<iostream.h>voidmain(){inti1=10,i2=20,*p1,*p2,*p;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;p=p1;p1=p2;p2=p;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}

p110i1

p220i2

p*p1*p*p2cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;*p1=20 *p2=10Output

*p1=10 *p2=20//例5-4交換指針值p110i173//例5-5交換指針所指對象的值#include<iostream.h>voidmain(){inti1=10,i2=20,i,*p1,*p2;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;i=*p1;*p1=*p2;*p2=i;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}

p110i1

p220i2

iinti1=10,i2=20,i,*p1,*p2;//例5-5交換指針所指對象的值p11074//例5-5交換指針所指對象的值#include<iostream.h>voidmain(){inti1=10,i2=20,i,*p1,*p2;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;i=*p1;*p1=*p2;*p2=i;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}

p110i1

p220i2p1=&i1;p2=&i2;*p1*p2

i//例5-5交換指針所指對象的值p11075//例5-5交換指針所指對象的值#include<iostream.h>voidmain(){inti1=10,i2=20,i,*p1,*p2;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;i=*p1;*p1=*p2;*p2=i;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}

p110i1

p220i2cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;*p1*p2

iOutput*p1=10 *p2=20//例5-5交換指針所指對象的值p11076//例5-5交換指針所指對象的值#include<iostream.h>voidmain(){inti1=10,i2=20,i,*p1,*p2;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;i=*p1;*p1=*p2;*p2=i;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}

p110i1

p220i2i=*p1;*p1*p2

i10Output*p1=10 *p2=20//例5-5交換指針所指對象的值p11077//例5-5交換指針所指對象的值#include<iostream.h>voidmain(){inti1=10,i2=20,i,*p1,*p2;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;i=*p1;*p1=*p2;*p2=i;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}

p110i1

p220i2*p1=*p2;*p1*p210i20Output*p1=10 *p2=20//例5-5交換指針所指對象的值p11078//例5-5交換指針所指對象的值#include<iostream.h>voidmain(){inti1=10,i2=20,i,*p1,*p2;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;i=*p1;*p1=*p2;*p2=i;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}

p120i1

p220i2*p2=i;10i*p1*p210Output*p1=10 *p2=20//例5-5交換指針所指對象的值p12079//例5-5交換指針所指對象的值#include<iostream.h>voidmain(){inti1=10,i2=20,i,*p1,*p2;p1=&i1;p2=&i2;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;i=*p1;*p1=*p2;*p2=i;cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;}

p120i1

p210i2cout<<"*p1="<<*p1<<'\t'<<"*p2="<<*p2<<endl;*p1=20 *p2=1010i*p1*p2Output*p1=10 *p2=20//例5-5交換指針所指對象的值p12080例如int**p2;int*p1;inti=3;p1=&i;p2=&p1;5.1.5指向指針的指針

指針變量的地址、二級指針例如5.1.5指向指針的指針

指針變量的地址、二級指81例如

int**p2;int*p1;inti=3;p1=&i;p2=&p1;

p2指向指針的指針例如p2指向指針的指針82例如int**p2;

int*p1;inti=3;p1=&i;p2=&p1;

p2

p1指向指針的指針例如p2p183例如int**p2;int*p1;inti=3;p1=&i;p2=&p1;

p2

p13i指向指針的指針例如p2p184例如int**p2;int*p1;inti=3;

p1=&i;p2=&p1;

p2

p13i指向指針的指針&i*p1例如p2p185例如int**p2;int*p1;inti=3;p1=&i;

p2=&p1;

p2

p13i&i*p1指向指針的指針&p1*p2例如p2p186例如int**p2;int*p1;inti=3;p1=&i;p2=&p1;

p2

p13i&p1*p2&i*p1p2=&i;

//非法,p2必須取指針變量的地址cout<<*i;

//非法,i不是指針指向指針的指針例如p2p187//例5-6#include<iostream.h>voidmain(){int****p4,***p3,**p2,*p1,i=3;p4=&p3;p3=&p2;p2=&p1;p1=&i;cout<<****p4<<endl;}3i&ip1&p1p2&p2p3&p3p4指向指針的指針//例5-63i&i88例5-8指向指針的指針#include<iostream.h>voidmain(){ inticount=18; int*iptr=&icount; *iptr=58; int**p; p=&iptr; cout<<*iptr<<endl; cout<<icount<<endl; cout<<iptr<<endl; cout<<&icount<<endl; cout<<&iptr<<endl; cout<<p<<endl;}例5-8指向指針的指針#include<iostre89 void指針變量能夠存放任意內存地址。因為沒有關聯(lián)類型,編譯器無法解釋所指對象,程序中必須對其作強制類型轉換,才可以按指定類型數(shù)據(jù)使用5.1.6指針的類型轉換 void指針變量能夠存放任意內存地址。因為沒有關聯(lián)類型,90——指針類型的強制轉換格式:(類型修飾符*)指針表達式 所有指針類型都可以賦給void指針而不需要類型轉換,但是void指針不能直接賦給另一個類型的指針?!羔橆愋偷膹娭妻D換91//例5-9#include<iostream.h>voidmain(){inta=65;int*ip;void*vp=&a;cout<<*(int*)vp<<endl;cout<<*(char*)vp<<endl;ip=(int*)vp;cout<<(*ip)<<endl;}指針的類型轉換//例5-9指針的類型轉換92//例5-9#include<iostream.h>voidmain(){inta=65;int*ip;

void*vp=&a;cout<<*(int*)vp<<endl;cout<<*(char*)vp<<endl;ip=(int*)vp;cout<<(*ip)<<endl;}定義無類型指針以整變量地址初始化指針的類型轉換//例5-9定義無類型指針指針的類型轉換93//例5-9#include<iostream.h>voidmain(){inta=65;int*ip;void*vp=&a;cout<<*(int*)vp<<endl;cout<<*(char*)vp<<endl;ip=(int*)vp;cout<<(*ip)<<endl;}強制類型轉換后訪問對象指針的類型轉換//例5-9強制類型轉換后指針的類型轉換94//例5-9#include<iostream.h>voidmain(){inta=65;int*ip;void*vp=&a;cout<<*(int*)vp<<endl;cout<<*(char*)vp<<endl;ip=(int*)vp;cout<<(*ip)<<endl;}轉換成字符型指針指針的類型轉換1.5.3指針變量與間址訪問//例5-9轉換成字符型指針指針的類型轉換1.5.3指95//例5-9#include<iostream.h>voidmain(){inta=65;int*ip;void*vp=&a;cout<<*(int*)vp<<endl;cout<<*(char*)vp<<endl;ip=(int*)vp;cout<<(*ip)<<endl;}向整型指針賦值指針的類型轉換//例5-9向整型指針賦值指針的類型轉換96//例5-9#include<iostream.h>voidmain(){inta=65;int*ip;void*vp=&a;cout<<*(int*)vp<<endl;cout<<*(char*)vp<<endl;ip=(int*)vp;cout<<(*ip)<<endl;}指針的類型轉換1.5.3指針變量與間址訪問//例5-9指針的類型轉換1.5.3指針變量與間址訪問97//例5-10#include<iostream.h>voidmain(){inta=321;//0x141int*ip;void*vp=&a;cout<<*(int*)vp<<endl;cout<<*(char*)vp<<endl;ip=(int*)vp;cout<<(*ip)<<endl;}1.5.3指針變量與間址訪問//例5-101.5.3指針變量與間址訪問98單步執(zhí)行:#include<iostream.h>voidmain(){ cout<<"short:"<<sizeof(short)<<endl; shorti=259;//0000000100000011 //高位0x01,低位0x03 char*p=(char*)&i; cout<<int(*p)<<endl; p++; cout<<(*p)<<endl;}單步執(zhí)行:#include<iostream.h>99 指針在使用中必須類型匹配。#include<iostream.h>voidmain(){ inticount=25; int*iptr=&icount; //*iptr=&icount; *iptr=50;} *iptr的類型是整型,&icount的類型是整型指針5.1.7指針類型的辨析 指針在使用中必須類型匹配。#include<iostr100 在32位機器中,整型和指針都是4個字節(jié),內存的表示方式也都是二進制整數(shù),但指針和整型數(shù)表示的是不同的類型。 指針和整型數(shù)可以進行強制類型轉換。#include<iostream.h>voidmain(){ inticount=25; int*iptr=&icount; *iptr=(int)&icount;

cout<<*iptr;} 在32位機器中,整型和指針都是4個字節(jié),內存的表示方式也都101第二節(jié)指針在數(shù)組中的運算指針只可以進行加減運算。數(shù)組名本身(不包括方括號和下標),它實際上是地址,表示數(shù)組起始地址。整型數(shù)組的數(shù)組名是一個整型地址,字符型數(shù)組的數(shù)組名是一個字符型地址。均可賦值給相應類型的指針。第二節(jié)指針在數(shù)組中的運算指針只可以進行加減運算。102——指針移動:移動n個單位格式: 指針變量+=n指針變量-=n移動的實際字節(jié)數(shù)=n*sizeof(指針關聯(lián)的類型)5.2.1指針的基本操作——指針移動:移動n個單位5.2.1指針的基本操作103——指針移動:移動1個單位格式:++指針變量指針變量++--指針變量指針變量--執(zhí)行intk,*pk=&k;cout<<endl<<++pk;cout<<endl<<pk;顯示的是兩個相同的地址——指針移動:移動1個單位104執(zhí)行intk,*pk=&k;cout<<endl<<pk++;cout<<endl<<pk;顯示的是兩個不同的地址執(zhí)行105指針的基本操作——正確理解下列組合操作的含義:*P++(*p)++*++p++*p指針的基本操作——正確理解下列組合操作的含義:106*p++:取p所指向單元的數(shù)據(jù)作為表達式的值,然后使p指向下一個單元;369pd初始狀態(tài):執(zhí)行*p++后369pd(*p++的值:3)*p++:取p所指向單元的數(shù)據(jù)作為表達式的值,然后使107(*p)++:取p所指向單元的數(shù)據(jù)作為表達式的值,然后使該單元的數(shù)據(jù)值增1;369pd初始狀態(tài):執(zhí)行(*p)++后469pd((*p)++的值:3)(*p)++:取p所指向單元的數(shù)據(jù)作為表達式的值,然后使該單108*++p:使p指向下一個單元,然后取該單元的數(shù)據(jù)作為表達式的值;369pd初始狀態(tài):執(zhí)行*++p后369pd(*++p的值:6)*++p:使p指向下一個單元,然后取該單元的數(shù)據(jù)作為表達式的109++*p:將p所指向單元的數(shù)據(jù)增1并作為表達式的值;369pd初始狀態(tài):執(zhí)行++*p后)469pd(++*p的值:4++*p:將p所指向單元的數(shù)據(jù)增1并作為表達式的369pd初110#include<iostream.h>voidmain(){ inta[4]={10,20,30,40}; int*p=a; cout<<*p++;cout<<endl<<(*p)++;cout<<endl<<*++p;cout<<endl<<++*p<<endl; cout<<endl; cout<<a[0]<<endl<<a[1]<<endl <<a[2]<<endl<<a[3]<<endl;}#include<iostream.h>111#include<iostream.h>voidmain(){ inta[10]; intsum=0; int*p=a;//intp=&a[0]; for(inti=0;i<10;i++) a[i]=2*i; for(i=0;i<10;i++) sum=sum+*p++; cout<<"sumis"<<sum<<endl;}舉例:#include<iostream.h>舉例:112#include<iostream.h>voidmain(){ inta[10]; intsum=0; int*p=a;//intp=&a[0]; for(inti=0;i<10;i++) a[i]=2*i; for(i=0;i<10;i++) sum=sum+

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論