【C语言学习记录】指针==地址
·
一、指针变量==存放地址的变量

二、指针类型——决定指向空间的大小

ex1、封装一个函数,实现两个数的交换

ex2、指针指向固定的区域

三、通过指针引用数组

ex3、 要求不管怎么输入五个数,在输出的时候都是由大到小的顺序输出,用函数封装实现

#include <stdio.h>
void InitNum(int *parr,int len)
{
int i;
puts("请输入5个数:");
for(i = 0; i < len; i++){
scanf("%d",parr++);
}
}
void MaxToMin(int *parr,int len)
{
int i,j;
int tmp;
for(i = 0; i < len-1; i++){
for(j = i+1; j < len; j++){
if(parr[i] < parr[j]){
tmp = parr[i];
parr[i] = parr[j];
parr[j] = tmp;
}
}
}
puts("");
}
void printfArr(int *parr,int len)
{
int i;
for(i = 0; i < len; i++){
printf("%d ",*parr++);
}
}
int main()
{
int arr[5];
int *p;
int len;
p = arr; //数组名就是数组的首地址
//p = arr[0]; //数组的首地址就是首个元素的地址
len = sizeof(arr)/sizeof(arr[0]);
InitNum(arr,len);//实际参数,数组的首地址: 名,首个元素的地址
puts("输入的5个数是:");
printfArr(arr,len);
MaxToMin(arr,len);
puts("从大到小排序为:");
printfArr(&arr[0],len);
return 0;
}
ex4、将数组中的n个元素按逆序存放
void initArray(int *parr, int size)
{
int i;
for(i=0;i<size;i++){
printf("请输入第%i个元素的数据:\n",i+1);
scanf("%d",parr++);
}
}
void revangeArry(int *parr, int size)
{
int i,j;
int tmp;
for(i=0;i<size/2;i++){
j = size-1-i;
tmp = parr[i];
parr[i] = parr[j];
parr[j] = tmp;
}
}
void printArray(int *parr, int size)
{
int i;
for(i=0;i<size;i++){
printf("%d ",*parr++);
}
putchar('\n');
}
int main()
{
int arry[5];
int size = sizeof(arry)/sizeof(arry[0]);
initArray(arry,size);//实际参数,数组的首地址: 名,首个元素的地址
printArray(&arry[0],size);
revangeArry(arry,size);
printArray(&arry[0],size);
return 0;
}
四、二维数组的有关指针



五、数组指针( int (*p)[4] )
定义一个指针,指向一个数组!

ex5、输出二维数组任意行列的数
#include <stdio.h>
/*输出二维数组任意行列的数*/
void InputHangLie(int *pi,int *pj)
{
printf("输入行列值:\n");
scanf("%d%d",pi,pj);
puts("done!");
}
int getTheData(int (*p)[4],int i,int j)
{
int data;
data = *(*(p+i)+j);
//data = p[i][j];
return data;
//return p[i][j];
}
int main()
{
int arr[3][4] = {{11,22,33,44},{12,13,15,16},{22,66,77,88}};
int i,j;
int data;
InputHangLie(&i,&j);
data = getTheData(arr,i,j);
printf("%d行%d列的值是%d\n",i,j,data);
return 0;
}
六、函数指针
函数名就是地址

ex6、输入两个数,再输入1(取大值),2(取小值),或者3(求和),用函数指针
#include <stdio.h>
#include <stdlib.h>
void initNum(int *pdata1, int *pdata2)
{
scanf("%d%d",pdata1,pdata2);
}
int getMax(int data1, int data2)
{
return data1>data2 ? data1:data2;
}
int getMin(int data1, int data2)
{
return data1<data2 ? data1:data2;
}
int getSum(int data1, int data2)
{
return data1+data2;
}
int dataHandler(int data1, int data2, int (*pfunc)(int, int ))
{
int ret;
ret = (*pfunc)(data1,data2);
return ret;
}
int main()
{
int a ;
int b ;
int cmd;
int ret;
printf("请输入2个数:\n");
void (*pinitNum)(int *pdata1, int *pdata2);
pinitNum = initNum;
(*pinitNum)(&a,&b);
//int (*pfunc)(int data1, int data2);
int (*pfunc)(int , int );
printf("请输入1(取大值),2(取小值),或者3(求和)\n");
scanf("%d",&cmd);
switch(cmd){
case 1:
pfunc = getMax;
//ret = (*pfunc)(a,b);
break;
case 2:
pfunc = getMin;
//ret = (*pfunc)(a,b);
break;
case 3:
pfunc = getSum;
//ret = (*pfunc)(a,b);
break;
default:
printf("输入错误!@输入1(取大值),2(取小值),或者3(求和)\n");
exit(-1);//包含头文件#include <stdlib.h>
break;
}
ret = dataHandler(a,b,pfunc);
printf("ret = %d\n",ret);
return 0;
}
七、指针数组( int* p[4] )


ex7、改写ex6,同时获得最大最小求和的值(函数指针数组)
int getMax(int data1, int data2)
{
return data1>data2 ? data1:data2;
}
int getMin(int data1, int data2)
{
return data1<data2 ? data1:data2;
}
int getSum(int data1, int data2)
{
return data1+data2;
}
int main()
{
int a = 10;
int b = 20;
int ret;
int (*pfunc[3])(int , int )={getMin,getMax,getSum};//函数指针数组!
for(int i=0;i<3;i++){
ret = (*pfunc[i])(a,b);
printf("ret = %d\n",ret);
}
return 0;
}
八、指针函数
返回指针值的函数

ex8、要求用户输入学生序号后,输出该学生的全部成绩,用指针函数实现,找出其中有不及格的课程的学生及其学生号
#include <stdio.h>
/*要求用户输入学生序号后,输出该学生的全部成绩,用指针函数实现*/
/*找出其中有不及格的课程的学生及其学生号*/
void getFail(int (*pstu)[4])
{
for(int i=0;i<3;i++){
for(int j=0;j<4;j++){
if(*(*(pstu+i)+j) < 60){
printf("第%d位第%d门成绩不合格:%d\n",i+1,j+1,*(*(pstu+i)+j));
}
}
}
}
int* getPosPerson(int pos, int (*pstu)[4])//函数指针,返回指针的函数
{
int *p;
p = (int *)(pstu+pos);
return p;
}
int main()
{
int scores[3][4]={{55,66,77,88},{66,67,68,59},{50,70,78,60}};
int *ppos;
int pos;
printf("请输入你需要看的学生号数:1,2,3\n");
scanf("%d",&pos);
ppos = getPosPerson(pos-1, scores);//输入0,1,2改为1,2,3
for(int i=0;i<4;i++){
printf("%d ",*ppos++);
}
putchar('\n');
printf("================================\n");
printf("不及格的学生及成绩有:\n");
getFail(scores);
return 0;
}

九、二级(多级)指针

ex9、改写ex8,要求用户输入学生序号后,输出该学生的全部成绩

十、总结

更多推荐



所有评论(0)