习题讲解
1、字符串排序
#include<stdio.h>
#include<stdlib> //malloc
int main()
{
int 1=0;
char ch;
char *str = (char*)malloc(sizeof(char) * 1024); //分配内存
char *ptr = str;
printf("please input : \n");
while( (ch = getchar() ) != '\n')
{
*(str + i) = ch;
i++;
}
while(*str != '\0')
{
if(*str == ' ')
{
*str = '\0';
}
str++;
}
while( str != ptr)
{
str--;
if(*str == '\0')
{
printf("%s", str + 1);
}
}
printf("%s\n", str);
return 0;
}
补充 : gets() 获取,但会警告不建议使用
scanf() 遇到空格结束
getchar()获取一个字符,遇空格不结束;
命令 man{
1、man1 查命令
2、man2 系统调用
3、man3 库函数 (包含头文件)
二、知识点
1、函数与指针
把函数的这个首地址(入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为“函数指针变量”。 (是指针)
函数指针变量定义的一般形式为: 类型说明符 (*指针变量名)();
例 :int (*pf)();
表示pf是一个指向函数入口的指针变量,该函数的返回值(函数值)是整型。
函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。
#include <stdio.h>
void print()
{
printf("helloworld\n");
}
int add(int x, int y)
{
return (x + y);
}
int main()
{
void (*p)(); //函数指针 指向一个没有形参、没有返回值的函数
p = print;
//print();
p();
int (*q)(int, int);
q = add;
q(1, 2);
printf("%d\n", q(1,2));
return 0;
}
2、int(*p)() 和 int *p()区别
(1)int (*p)()是一个变量说明,说明p是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少。
(2)int *p()则不是变量说明而是函数说明,说明p是一个指针型函数,其返回值是一个指向整型量的指针,*p两边没有括号。作为函数说明,在括号内最好写入形式参数,这样便于与变量说明区别。
对于指针型函数定义,int *p()只是函数头部分,一般还应该有函数体部分。
3、思考:
下面两个表达式什么意思?
int *(*(*fp)(int))[10];
括号里 fp是一个指针
出了括号,向右看,发现一个带一个int参数的函数,再向左看,返回一个指针
再出括号,碰到【10】 一个10元素的数组,左看,一个指针,再左看int类型
综上 fp是一个指针,指向一个10个int类型指针元素的指针数组。
int *(*(*array[5])())();
array是一个数组,有5个元素指针
指针指向一个函数,函数没有参数,函数的返回值是一个指针
指针指向一个函数,函数没有参数,函数的返回值是一个指针
发现int类型
综上 arr被声明成为一个函数的指针数组,该函数返回指向函数指针的指针。
3、二维数组和指针
一个数组的元素值为指针则是指针数组。
指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。
指针数组说明的一般形式为:
类型说明符 *数组名[数组长度]
其中类型说明符为指针值所指向的变量的类型。
例如: int *pa[3];
表示pa是一个指针数组,它有三个数组元素,每个元素值都是一个指针,指向整型变量。
表示形式 | 含义 | 地址值 |
&a | 指向二维数组的指针 | 1000 |
a | 二维数组名,指向一维数组a[0],即第0行首地址 | 1000 |
a[0] , *(a+0) , *a | 第0行第0列元素地址 | 1000 |
a+1 , &a[1] | 第1行首地址 | 1006 |
a[1] , *(a+1) | 第1行第0列元素地址 | 1006 |
a[1]+2 , *(a+1)+2 , &a[1][2] | 第1行第2列元素地址 | 1010 |
*(a[1]+2) , *(*(a+1)+2) , a[1][2] | 第1行第2列元素的值 | 元素值为11 |
注: &a[i]或a+i指向行,而a[i]或*(a+i)指向列
#include<stdio.h>
int main()
{
int a[3][4] = {{1, 2, 3, 4}, {3, 4, 5, 6}, {5, 6, 7, 8}};//定义一个二维数组
int i;
int(*p)[4] = a, *q = a[0]; //保证a与p的步长一致; p指代a含有四个元素的行
q首行首地址;
for(i = 0; i < 3;i++)
{
if(i == 0)
(*p)[i + i/2] = *q + 1; // 1 = 1+1
else
p++, q++; //p下移三行,q右移三行
}
for(i = 0; i < 3; i++)
{
printf("%d ", a[i][i]); // a[0][0] a[1][1] a[2][2]
}
printf("%d,%d\n", *((int *)p), *q);
return 0;
}