C指针二.docx
《C指针二.docx》由会员分享,可在线阅读,更多相关《C指针二.docx(21页珍藏版)》请在冰点文库上搜索。
C指针二
/*
*指针数组
*Lzy 2011-5-13
*/
#include
#include
int main()
{
int X[3][3] = {{1,2,3},{4,5,6},{7,8,9}};/*定义一个二维数组并初始化*/
//intX[3][3]={1,2,3,4,5,6,7,8,9};
int *P[3] = {X[0],X[1],X[2]}; /*定义一个指针数组*/
int *ptr; /*定义一个指针变量*/
int **p; /*定义一个二级指针变量*/
int i;
ptr = P[0]; /*一级地址给指针变量ptr*/
for(i = 0; i < 3; i++)
printf("%d",*ptr++); /*打印?
*/
printf("\n----------\n");
p = P; /*二级地址给二级指针变量p*/
for(i = 0; i < 3; i++)
printf("%d",**p++); /*打印?
*/
printf("\n");
}
/*
*指向二维数组元素的指针变量
*Lzy 2011-5-13
*/
#include
int main()
{
int data[2][3] = {1,2,3,4,5,6}; /*二维数组初始化*/
int *ptr;
ptr = (int *)data; /*强制转换*/
for(; ptr < data[0] +6 /*ptr printf("%d",*ptr);
printf("\n");
return 0;
}
/*
*指向一维数组的指针变量
*Lzy 2011-5-13
*/
#include
int main()
{
int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};/*数组初始化*/ int (*p)[4]=a,*q=a[0];
int i;
for(i=0;i<3;i++)
{
if(i==0)
(*p)[i+i/2]=*q+1;/*a[0][0]=1+1=2*/
else
p++,++q;/*p加一次表示地址下移4个元素,q表示下移一个元素*/
}
for(i=0;i<3;i++)
printf("%d,",a[i][i]);
printf("%d,%d\n",*((int *)p),*q); /**p[0]与*((int *)p)一样*/
/*p[0]与p,*p一样表示地址*/
return 0;
}
3个学生各学4门课,计算总平均分,并输出第n个学生成绩
/*
*二维数组的指针作函数参数
*Lzy 2011-5-13
*/
#include
int main()
{
void average(float *p,int n);
void search(float (*p)[4],int n);
float score[3][4]={{65,67,79,60},{80,87,90,81},{90,99,100,98}};
average(score[1],4);
search(score,1);
return 0;
}
void search(float (*p)[4],int n)
{
int i;
for(i = 0; i < 4; i++)
printf("%5.2f\t",*(*(p+n)+i));
printf("\n");
}
void average(float *p,int n)
{
float sum = 0, aver;
float *p_end = p + n;
for(; p sum += *p;
aver = sum / n;
printf("aver=%5.2f\n",aver);
}
解析:
一、你的floatscore数组定义的是:
一个3行、4列的二维浮点数组,数组的元素为浮点数。
如果你换个格式书写就清晰了!
floatscore[3][4]={{65,67,70,60,},{80,87,90,81,},{90,99,100,98}};
在调用的过程中,score就是这个数组的首地址,指向的是浮点数组{65,67,70,60,}。
score+1指向的是数组{80,87,90,81,}。
二、你的float*p定义的是:
一个指向浮点数的指针。
这个是一维的。
在调用的过程中,float指向的是xx。
一个浮点数字。
两个的定义不同,所以参数传递过程中会出错。
三、你的float(*p)[4]定义的是:
一个指向含有四个元素的浮点数组的指针。
在调用的过程中,float指向的是{xxx,xx,xx,xx,},由四个浮点数组成的数组。
这时两个定义相同,所以参数传递过程中没有错误。
四、有个建议,你的程序书写格式不清晰,不利于你纠错和修改,应该尽量的清晰、明确,不建议使用简化方式定义参数。
作为一个软件工作者,应该尽量使程序流畅、格式清晰、易读,这是一个软件工作者最基本的职业素养。
格式化后,程序如下,会清晰很多:
#include
voidmain()
{
voidsearch(float(*p)[4],intn);/*这里的float*p好像有问题*/
floatscore[3][4]={{65,67,70,60,},{80,87,90,81,},{90,99,100,98}};
search(score,2);
}
voidsearch(float(*p)[4],intn)/*这里的float*p好像有问题*/
{
inti;
printf("thescoreofNo.%dare:
\n",n);
for(i=0;i<4;i++)
{
printf("%5.2f",*(*(p+n)+i));
}
printf("\n");
}
既然score是一个二位数组,要想传参数,肯定要使用相应等级的指针(二位指针,数组指针,指针数组),总之不能使用一维数组啊float(*p)[4]和float**p是一个等级,所以可以的
首先要搞清楚*p和(*p)[4]分别是什么在定义的时候float*p定义了一个1维指针。
而score是一个二维数组。
会出现格式不对应的情况。
那为什么(*p)[4]为什么可以呢?
根据运算符优先级,括号里面优先级高,所以这是一个数组指针。
本质上是个指针,指针指向一个有4个元素的数组。
那怎样和score联系起来就显然了,一开始他先指向score的第一行,该行有4个元素。
然后可以指向下一行。
表示二维数组除了这个方式,还有*p[4](指针数组),**p(指针的指针),p[3][4](原型)。
在函数中的调用如下:
float (*p)[4] 声明了一个二维数组,其中第二维是固定的4,第一维是动态的。
float *p[4]这声明了一个二维数组,其中第一维是固定的4,第二维是动态的
(1)chara[m][n]--voidfunc(char(*p)[]);二维数组退化为数组的指针
(2)char*p[n]--voidfunc(char**p);这个是一个指针数组,我们只需要取地址即可;
(3)char(*p)[n]--voidfunc(char(*p)[]);这个本身就是一个数组指针,原封不动即可;
(4)char**p--voidfunc(char**p);对于指针的指针类型,同样原封不动。
/*
*指针与字符串
*Lzy 2011-5-13
*/
#include
int main()
{
char str[] = "ILovethisgirl!
";
char *ptr = str;
printf("%s\n",ptr);
printf("%s\n",ptr + 7);
return 0;
}
/*
*用字符指针实现
*Lzy 2011-5-13
*/
#include
int main()
{
char *ptr = "ILovethisgirl!
";
printf("%s\n",ptr);
printf("%s\n",ptr + 7);
return 0;
}
下面这个是个错误程序:
/*
*用字符指针实现(注意)
*Lzy 2011-5-13
*/
#include
int main()
{
char *ptr = "ILovethisgirl!
";
*(ptr + 2) = 'l'; 原因给常量赋值 /*错误右边指向的是常量*/
printf("%s\n",ptr);
return 0;
}
用函数调用实现字符串复制
/*
*用字符数组作参数
*Lzy 2011-5-13
*/
#include
void kstrcpy(char from[], char to[])
{
int i = 0;
while(from[i])
{
to[i] = from[i];
i++;
}
to[i] = '\0';
printf("%s\n",to);
}
int main()
{
char str1[] = "ILove";
char str2[] = "thisgirl!
";
kstrcpy(str1,str2);
printf("%s\n",str2);
}
/*
*用字符指针作参数
*Lzy 2011-5-13
*/
#include
void kstrcpy(char *from, char *to)
{
while(*from)
{
*to = *from;
putchar(*to);
from++;
to++;
}
*to = '\0';
printf("\n");
}
int main()
{
char str1[] = "ILove";
char str2[] = "thisgirl!
";
kstrcpy(str1,str2);
printf("%s\n",str2);
}
/*
*函数指针调用函数
*Lzy 2011-5-13
*/
#include
#include
void fun(int); /* 函数声明 */
int main()
{
int x = 6;
void (*p)(int); /* 定义函数指针变量 */
p = &fun; /* 将fun函数的首地址赋给函数指针变量p*/
fun(x); /* 直接调用fun函数 */
(*p)(x); /* 通过函数指针变量p调用fun函数 */
return 0;
}
void fun(int x) /* 函数定义 */
{
printf("%d\n", x);
}
用函数指针变量作参数,求最大值、最小值和两数之和
/*
*函数指针作函数的参数
*Lzy 2011-5-13
*/
#include
int add(int x, int y)
{
return x+y;
}
int fun(int x, int y,int (*p)())
{
printf("结果:
%d\n",(*p)(x,y));
}
int main()
{
int x,y;
printf("输入两个数:
");
scanf("%d,%d",&x,&y);
fun(x,y,add);
}
/*
*返回指针值的函数
*Lzy 2011-5-13
*/
#include
char *kstrcpy(char from[], char to[])
{
int i=0;
while(from[i])
{
to[i]=from[i];
i++;
}
to[i]= '\0';
return to;
}
int main()
{
char str1[]= "ILove";
char str2[]= "thisgirl!
";
printf("%s\n",kstrcpy(str1,str2));
}
写一个函数,求两个int型变量中居于较大值的变量的地址
/*
*返回指针值的函数
*Lzy 2011-5-13
*/
#include
int *fun(int *a, int *b)
{
if(*a>*b)
return a;
else
return b;
}
int main()
{
int a=2,b=3;
printf("%x\n",fun(&a,&b));
return 0;
}
/*
*指针数组
*Lzy 2011-5-13
*/
#include
int main()
{
char *name[]={"Followme","BASIC","GreatWall","FORTRAN","Computer"};
int i;
for(i=0;i<5;i++)
printf("%s\n",name[i]);
}
/*
*野指针
*Lzy 2011-5-13
*/
#include
int main(int argc, char *argv[])
{
int *p;
p = (int *)malloc(sizeof(int)); /*在堆中分配内存空间*/
*p = 0;
printf("%d\n",*p);
free(p); /*释放空间*/
*p = 5; /*(危险)野指针*/
printf("%d\n",*p);
p=NULL;
}
其他:
1、.编写一函数,用于接收3-10之间的一个数,然后输出由星号组成的正方形。
例如,用户输入4,输出结果应为如下所示
****
* *
* *
****
/***************************************************
文件名:
说 明:
熟习函数的使用,完成打印正方形图形
Autor:
Lzy
Time :
2011-5-8
****************************************************/
#include
int init()
{
int n = 0;
while(n > 11 || n < 2) /*判断输入是否合法,否则重新输入*/
{
printf("输入正方形的长度(大于2小于11):
");
scanf("%d",&n);
}
return n;
}
void fprint(int N)
{
int i, j;
for(i = 0; i < N; i++)
printf("*");
printf("\n");
for(i = 0; i < N-2; i++)
{
printf("*");
j = N - 2;
while(j--)
printf("");
printf("*\n");
}
for(i = 0; i < N; i++)
printf("*");
printf("\n");
}
int main()
{
int side;
side = init();
fprint(side);
}
2、编写一个函数,输入字符串内,如果是两个以上连续空格,则用一个空格代替不明白
/******************************************
文件名:
说 明:
continue的使用
Autor:
Lzy
Time :
2011-5-9
*******************************************/
#include
int main()
{
char c;
char flag = 0;
while((c = getchar()) !
= EOF)
{
if(flag == c)
if( c == '')
continue;
putchar(c);
flag = c;
}
}
3、写一个函数找出一个整数数组中,第二大的数
#include
#define N5
int main()
{
int data[N]={8,2,6,4,5};
int i,j;
int temp;
for(j=0;j for(i=j;i {
if(data[j]>data[i+1])
{
temp=data[j];
data[j]=data[i+1];
data[i+1]=temp;
}
}
printf("%d",data[N-2]);
return 0;
}