您的位置:首页 > 其它

第二十五章补充内容 15再谈指针

2012-10-15 21:55 295 查看
// 第二十五章补充内容 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;
}}
*/


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: