您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
048第八章 指针08(新版)
发布时间:2021-05-04 19:10:23编辑:雪饮阅读()
指针函数的应用
一个函数可以带回一个整型值、字符值、实型值等,也可以带回指针型的数据,即地址。其概念与以前类似,只是带回的值的类型是指针类型而已。
有若干个学生的成绩(每个学生有4门课程),要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数来实现。
可以看看下面这个实例:
#include <stdio.h>
void main()
{
double score[][4] = {{60.0, 70.0, 80.5, 90.5}, {56.0, 89.0, 67.0, 88.0}, {34.2, 78.5, 90.5, 66.0}};
//double(*pointer)[4]:数组指针
double *search(double(*pointer)[4], int n);
double *p;
int i, m;
printf("Please enter the number of student: ");
scanf("%d", &m);
printf("The scores of No.%d are: \n", m);
p = search(score, m);
for( i=0; i < 4; i++)
{
printf("%5.2f\t", *(p + i));
}
printf("\n\n\n");
}
double *search(double (*pointer)[4], int n)
{
double *pt;
/*
*pointer:一维数组0行0列
*(pointer + n):一维数组的n行0列
*/
pt = *(pointer + n);
return pt;
}
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
Please enter the number of student: 1
The scores of No.1 are:
56.00 89.00 67.00 88.00
指针数组与指向指针的指针
指针数组的概念:
一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都相当于一个指针变量。
例如实例:
#include <stdio.h>
void main()
{
int a[5] = {1, 3, 5, 7, 9};
/*
指针数组,但是如果写成如:int (*name)
则表示的是变量name用于接收一个数组的指针
*/
int *name[5] = {&a[0], &a[1], &a[2], &a[3], &a[4]};
for( i=0; i < 5; i++ )
{
printf("%d ", *name[i]);
}
printf("\n\n");
}
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
1 3 5 7 9
指针数组实现字符串数组
这里是字符串数组,可不是字符数组哦
并可以为其实现排序输出等。
实例如:
#include <stdio.h>
#include <string.h>
void sort(char *name[], int n)
{
char *temp;
int i, j, k;
for( i=0; i < n-1; i++ )
{
k = i;
for( j=i+1; j < n; j++ )
{
/*
strcmp函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。
基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。
*/
if( strcmp(name[k], name[j]) > 0 )
{
k = j;
}
//其实感觉小甲鱼这样写有点多余了,直接可以写到上面的if里面的k=j下面的
if( k != i )
{
temp = name[i];
name[i] = name[k];
name[k] = temp;
}
}
}
}
void print(char *name[], int n)
{
int i;
for( i=0; i < n; i++ )
{
printf("%s\n", name[i]);
}
}
void main()
{
char *name[] = {"baidu.com", "www.baidu.com", "home.baidu.com", "baidu.com/dz"};
int n = 4;
sort(name, n);
print(name, n);
}
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
baidu.com
baidu.com/dz
home.baidu.com
指向指针的指针
怎样定义一个指向指针数据的指针变量呢?
可以看看如下实例:
#include <stdio.h>
void main()
{
char *name[] = {"baidu.com", "www.baidu.com", "home.baidu.com", "baidu.com/dz"};
/*
接收指向指针的指针
p的前面有两个*号。*运算符的结合性是从右到左,因此**p相当于*(*p),显然*p是指针变量的定义形式。如果没有最前面的*,那就是定义了一个指向字符数据的指针变量。
现在它前面又有一个*号,表示指针变量p是指向一个字符指针变量的。*p就是p所指向的另一个指针变量。
*/
char **p;
int i;
for( i=0; i < 4; i++ )
{
/*
由于*name[]本来就是定义一个指针数组,而由于数组名本身就是指向数组第一个元素的指针,
而这里由于字符串数组,而字符串本身也是指针可以定义存储的,所以这里可以用指向指针的指针的变量类型来接收元素的指针
*/
p = name + i;
/*
而对于一个普通(非定义型)的左值来说如果这个左值本身就是指针,则就是拿到它的值,而不是地址,
那么要说仍然也是取址也是没有问题的,因为这里目前已经是指向指针的指针了,那么最后一个取址
已经没有地址了,就是指向值本身了,所以就取到了最终的字符串了
*/
printf("%s\n", *p);
}
}
关键字词:指针,数组,字符,字符串