1. 二级指针(指向指针变量的指针)
- 定义:二级指针是指向一级指针变量的指针。
- 使用场景:
① 函数体内需修改函数体外指针变量值时,传递指针变量的地址(即二级指针);
② 指针数组传参时,数组名是二级指针(指向第一个指针元素的指针)。
2. void指针
- 作用:表示内存地址,通常用作函数传参和函数返回值。
- 类型转换规则:
- char *、int *、double * 转为 void * 时,需要强制类型转换;
- void * 转为 char *、int *、double * 时,不需要强制类型转换。
3. volatile指针
- 关键字作用:常与指针或变量搭配使用,表示变量或指针指向空间的数据易被改变,防止编译器优化(每次读写变量都直接访问内存)。
4. 数组指针与指针数组
- 概念区分:
- 数组指针:是指针,指向整个数组;
- 指针数组:是数组,每个元素都是指针。
- 指针数组示例:字符型指针数组可用于操作字符串数组(如 const char *pstr[12] 存储月份字符串)。
- 数组指针特性:
- 定义形式:如 int (*p)[5];
- sizeof 操作:数组名(如 a)的大小是数组总字节数(如 int a[5] 的 sizeof(a) 为 20),指针大小为 8;
- & 和 * 操作:& 数组名时类型升级为指向数组的指针(如 &a 是 int (*)[5]),* 数组指针时类型降级为指向数组元素的指针。
5. 二维数组传参
- 数组名性质:二维数组名是行指针(指向数组第一行元素的数组指针)。
- 访问方式:支持多种形式(如 a[m][n]、*(a + m) + n 等)。
- 传参方式:可通过 int (*q)[3] = a; 等方式传递二维数组。
6. 指针数组传参
- 示例:指针数组 int *a[5] 作为函数参数时,函数定义为 int fun(int **pa, int len),调用时为 fun(a, 5)。
7.代码练习
封装函数从终端接收5个字符串,封装函数从大到小对字符串排序,封装函数打印字符串排序后的结果。
#include <stdio.h>
#include <string.h>
void ipt(char *ppstr[],int len)
{
int i = 0;
for(i = 0; i < len; i++)
{
gets(ppstr[i]);
}
}
int maopao(char *ppstr[],int len)
{
int j = 0;
int i = 0;
char *tmp = NULL;
for(j = 0; j < len – 1; j++)
{
for(i = 0; i < len -1 -j; i++)
{
if(strcmp(ppstr[i],ppstr[i+1]) < 0)
{
tmp = ppstr[i];
ppstr[i] = ppstr[i+1];
ppstr[i+1] = tmp;
}
}
}
return 0;
}
void opt(char *ppstr[],int len)
{
int i = 0;
for(i = 0; i < len; i++)
{
printf("pstr[%d] = %s\\n",i,ppstr[i]);
}
}
int main(void)
{
char str[5][32] = {0};
char *pstr[5] = {str[0],str[1],str[2],str[3],str[4]};
ipt(pstr,5);
maopao(pstr,5);
opt(pstr,5);
return 0;
}
网硕互联帮助中心





评论前必须登录!
注册