// 第二十五章补充内容 15再谈指针 // 15.1 指针与数组 /*#include <iostream> using namespace std; int main() { int ch[2][3] = { {0,1,2}, {10,11,12} }; int *p1 = &ch[1][2]; //指向12的地址 int *p2 = ch[1] + 2; //指向3的地址,也就是第四个元素的地址 //最先的理解是错的,char[1]也就是第个行的数据,然后加1,不就是ch[1][2] 12 int *p3 = ch[0]; //0 int *p4 = ch[1]; //10 cout<<*p1<<endl; cout<<*p2<<endl; cout<<*p3<<endl; cout<<*p4<<endl; return 0; }*/ /*#include <iostream> using namespace std; int main() { int a[3][4]={ {1,2,3,4}, {11,22,33,44}, {111,222,333,444} }; cout<<a<<" "<<*a<<" "<<a[0][0]<<endl; //1 cout<<a[0]<<" "<<*(a+0)<<" "<<a[0][0]<<endl;//1 cout<<&a[0]<<" "<<&a[0][0]<<" "<<a[0][0]<<endl; //1 cout<<a[1]<<" "<<a+1<<" "<<a[1][0]<<endl; //11 cout<<&a[1][0]<<" "<<*(a+1)+0<<endl; //11 cout<<a[2]<<" "<<*(a+2)<<endl; //111 cout<<&a[2]<<" "<<a+2<<endl; //2 cout<<a[1][0]<<" "<<*(*(a+1)+0)<<endl; //11 return 0; }*/ //15.2 指针操作多维数组 /* #include <iostream> using namespace std; int main() { int a[3][4]={ {1,2,3,4}, {11,22,33,44}, {111,222,333,444} }; int *p; for(p=a[0]; p<=a[0]+12; p++) //for(p=a[0]; p<=&a[2][3]; p++) { //cout<<"p:"<<*p<<endl; //cout<<"a[0][0]:"<<a[0][0]<<endl; //if( ((*p)-(a[0][0])) % 4 == 0) cout<<"p:"<<p<<" a[0]:"<<a[0]<<" p-a[0]:"<<(p-a[0])<<endl; //这里是内存地址的移动 if((p-a[0]) % 4 == 0) { cout<<endl; } cout<<*p<<endl; } return 0; }*/ /*#include <iostream> using namespace std; int main() { int a[3][4]={ {1,2,3,4}, {11,22,33,44}, {111,222,333,444} }; int (*p)[4], i, j; //注意int(*p)[4]; 其中的p是一个指针,它指向一个具有四个元素的一维数组,由于方括号[]的级别高于*,因此*p用小括号括了起来, //表示它的级别要高于方括号, //int *p[4]; 那么它表示的是一个具有4个指针的指针数组p p = a; //这里p是针a[0]的值赋给了这,这样p就表示第一行,而*p则读取了第一行的地址,使指针先指向正确的行,然后通过列计算来确定列数 // *(*(p)+1) a[0][1]的值2 //注意: *(p+i)+j一定不要写成了(p+i)+j; 比如说我们不要将*(p+2)+3写成(p+2)+3, //*(p+2)+3是首先决定了某行后,再确定某列,它与p+11相等,也就是说它指向的是第十二个元素,但是(P+2)+3 //等于(p+5) cout<<"请输入行号:"; cin>>i; cout<<"请输入列号:"; cin>>j; cout<<"a["<<i<<"]["<<j<<"]:"<<*(*(p+i)+j)<<endl; return 0; }*/ //15.3 指向多维数组的指针作为函数参数 /*#include <iostream> using namespace std; int main() { void sum(int *p, int n); void find(int(*p)[3], int n);//int(*p)[3] 指向一个有三个元素的数组指针p int num[2][3] = { {1,2,3}, {4,5,6} }; sum(*num,6); find(num,1); return 0; } void sum(int *p, int n) { int *end; int sum=0; end = p + n - 1; for(; p<=end; p++){ sum = sum+(*p); } cout<<"所有元素相加的总和为:"<<sum<<endl; } void find(int (*p)[3], int n) { int i; cout<<"第"<<n+1<<"行的元素为:"<<endl; for(i=0; i<3; i++){ cout<<*(*(p+n)+i)<<" "; } }*/ //15.4 字符串的指针 /*#include <iostream> using namespace std; int main() { char ch1[]="hello word", ch2[20]; int i=0; for(i=0; ch1[i] !='\0'; i++){ *(ch2+i) = *(ch1+i); } *(ch2+i)='\0'; cout<<"ch1:"<<ch1<<endl; cout<<"ch2:"<<ch2<<endl; return 0; }*/ /*#include <iostream> using namespace std; int main() { char ch1[]="hello word", ch2[20]; char *p = ch1, *p2 = ch2; for(; *p!='\0'; p++, p2++) { *p2 = *p; } *p2='\0'; cout<<"ch1:"<<ch1<<endl; cout<<"ch2:"<<ch2<<endl; return 0; }*/ // 15.5 接受字符串指针的函数 /*#include <iostream> using namespace std; void copy(char a[], char b[]) { int i=0; for(i=0; a[i] !='\0'; i++){ b[i] = a[i]; } b[i]='\0'; } void main() { char ch1[]="hello word"; char ch2[20]; copy(ch1,ch2); cout<<"ch1:"<<ch1<<endl; cout<<"ch2:"<<ch2<<endl; }*/ /*#include <iostream> using namespace std; void copy(char *p, char *pp) { //for(; *p !='\0'; p++,pp++) for(; (*pp++=*p++)!='\0';) { //(*pp) = (*p); } *pp='\0'; }; void main() { char ch1[]="hello word"; char ch2[20]; copy(ch1,ch2); cout<<"ch1:"<<ch1<<endl; cout<<"ch2:"<<ch2<<endl; }*/ //15.6 指向字符串的指针变量与字符数组的区别 //C语言的字符串有两种表现形式 //char*ch = "Hello world"; //char ch[] = "Hello world"; //两种形式都能实现字符中的存储,但是它们是有区别的,区别主要有以下几点 //1 赋值的不同 //2 初始化的不同 //3 值的不同 //4 定义的不同 // 15.7 指向函数的指针 //指针除了可以指向数组之外,还可以指向函数,由于函数名即函数的入口地址,因此假如将函数名赋给指针变量,那么我们就可以通过这个指针来调用函数 /*#include <iostream> using namespace std; void show() { cout<<"hello world"<<endl; } int main() { void (*p)(); //定义指向函数的指针变量p,该函数返回值为void,也就是说它没有返回值 //(*p)后面的括号不能省略,它表示指针p指向的是一个函数 p = show; (*p)(); return 0; }*/ //15.8 指向函数的指针的用途 /*#include <iostream> using namespace std; int max(int, int); int min(int, int); int add(int, int); //这里的int(*p)(int, int)是一个函数指针 void func(int x, int y, int(*p)(int, int)); int main() { int a, b; cout<<"请输入a的值:"; cin>>a; cout<<"请输入b的值:"; cin>>b; cout<<"最大值为:"; func(a,b,max); cout<<"最小值为:"; func(a,b,min); cout<<"两值的和为:"; func(a,b,add); return 0; } int max(int x, int y) { int z; if(x>y){ z = x; }else{ z = y; } return (z); } int min(int x, int y) { int z; if(x< y){ z = x; }else{ z = y; } return z; } int add(int x, int y) { int z; z = x+y; return z; } void func(int x, int y, int(*p)(int,int)) { int z; z = (*p)(x,y); cout<<"z:"<<z<<endl; }*/ //不过假如我们不是只用函数名作形参,而是在函数名后面加括号 //void func(int x, int y, int p(int,int)) /*#include <iostream> using namespace std; int max(int, int); int min(int, int); int add(int, int); //这里的int(*p)(int, int)是一个函数指针 void func(int x, int y, int p(int, int)); int main() { int a, b; cout<<"请输入a的值:"; cin>>a; cout<<"请输入b的值:"; cin>>b; cout<<"最大值为:"; func(a,b,max); cout<<"最小值为:"; func(a,b,min); cout<<"两值的和为:"; func(a,b,add); return 0; } int max(int x, int y) { int z; if(x>y){ z = x; }else{ z = y; } return (z); } int min(int x, int y) { int z; if(x< y){ z = x; }else{ z = y; } return z; } int add(int x, int y) { int z; z = x+y; return z; } void func(int x, int y, int p(int,int)) { int z; z = (*p)(x,y); cout<<"z:"<<z<<endl; }*/ //15.9 指针数组 //由多个指针组成的数组即指针数组 //int *p[10] //这定义了一个拥有10个指针的数组p,它的每个元素都是指针,请注意它与 int (*p)[10]是不同的 //int(*p)[10]中的p是个指向一维数组的指针变量 /*#include <iostream> using namespace std; void show(char *name[], int n); int main() { char *ch[]={"Jack","Mark","Xlc"}; show(ch, 3); return 0; } void show(char *name[], int n) { int i; for(i=0; i<n; i++) { cout<<"name["<<i<<"]:"<<name[i]<<endl; } } */ //15.10 指向指针的指针 //一个指针变量可以指向一个整值,也可以指向一个指针 /*#include <iostream> using namespace std; int main() { int s=5; int *i = &s; cout<<"i的值为:"<<*i<<endl; cout<<"i的地址为:"<<i<<endl; int **ii; ii = &i; cout<<"ii的地址为:"<<ii<<endl; cout<<"ii的值为:"<<*ii<<endl; //自己对指针的指针理解还是不够了,没有实现想要的效果 return 0; }*/ /* #include <iostream> using namespace std; int main() { char *name[] = {"Jack","Mick","Xlc"}; char **p; int i; for(int i=0; i<3; i++) { p = name+i; cout<<*p<<endl; } return 0; }*/ /*#include <iostream> using namespace std; int main() { int a[5]={1,2,3,4,5}; int *p1[5]; int **p2 = p1; for(int i=0; i<5; i++) { p2[i] = &a[i]; } for(int i=0; i<5; i++) { cout<<**p2; p2++; } return 0; }} */