指针:
- 什么是指针:指针表示内存地址,平时所说的指针一般是保存地址的指针变量。
- 定义指针变量
- 格式:数据类型 *指针变量名。
- 初始化和赋值:指针指向变量的首地址。定义指针后若未赋值则为野指针;可将变量地址赋给指针使其指向该变量;还可定义指针时初始化为NULL(空地址)。
- 通过指针的间接访问:直接通过变量名访问是直接访问,通过变量地址(指针)访问是间接访问,对地址进行解引用(取*)可通过指针访问变量。*在定义指针变量和对地址解引用时用法不同。
- 指针的运算:指针常用加法和减法运算,加减运算表示向后或向前偏移n个字节,n由指针的数据类型决定。
- 指针的大小:指针大小和数据类型无关,由操作系统决定,32位操作系统占4Byte,64位操作系统占8Byte。
- 指针和一维整形数组:数组名表示数组首地址,指针指向一维数组时,可直接将数组名赋值给指针。存在多种等价关系,如[i]<==>对地址先偏移i个字节,再解引用(取*) ,arr[i]<==>*(p+i)等。
练习:(1)使用指针输入输出数组元素
// 使用指针输入输出数组元素
#include<stdio.h>
int main(int argc, const char *argv[])
{
int arr[5]; // 定义一个包含5个整数的数组
int *p = arr; // 指针p指向arr数组
int i;
// 输入数组元素
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("请输入第%d个整数:", i + 1);
scanf("%d", p + i); // 使用指针输入数组元素
}
// 输出数组元素
printf("数组元素为:\n");
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%d\t", *(p + i)); // 使用指针输出数组元素
}
printf("\n");
return 0;
}
解释:
- 第2行:包含标准输入输出头文件
stdio.h
。 - 第4行:定义主函数
main
,参数为命令行参数的数量和内容。 - 第6行:声明一个包含5个整数的数组
arr
。 - 第7行:声明一个指向数组的指针
p
并初始化为指向arr
。 - 第8行:声明循环变量
i
。 - 第11-15行:提示用户输入5个整数,并通过指针
p
将输入的值存储到数组中。 - 第18行:输出数组元素的提示信息。
- 第19-21行:通过指针
p
遍历数组并输出每个元素的值,以制表符分隔。 - 第22行:在输出完所有元素后换行。
- 第23行:返回0,表示程序正常结束。
(2)数组最大值
// 数组最大值
#include<stdio.h>
int main()
{
int arr[] = {12, 34, 56, 78, 90}; // 定义一个包含5个整数的数组
int *p = arr; // 定义一个指向数组的指针
int max = *p; // 假设第一个元素是最大值
int size = sizeof(arr) / sizeof(arr[0]); // 计算数组的大小
for (int i = 1; i < size; i++)
{
if (*(p + i) > max)
{
max = *(p + i); // 更新最大值
}
}
printf("数组中的最大值是:%d\n", max);
return 0;
}
解释:
- 第2行:包含标准输入输出头文件
stdio.h
。 - 第4行:定义主函数
main
。 - 第6行:声明并初始化一个包含5个整数的数组
arr
。 - 第7行:声明一个指向数组的指针
p
并初始化为指向arr
。 - 第8行:假设第一个元素是最大值,将其赋值给
max
。 - 第9行:计算数组的大小,并将其赋值给
size
。 - 第11-15行:遍历数组(从第二个元素开始),如果发现比当前
max
更大的元素,则更新max
。 - 第17行:输出数组中的最大值。
- 第18行:返回0,表示程序正常结束。
作业:
输入带空格的字符串,删除字符串中的空格
#include<stdio.h>
int main()
{
char str[100];
char result[100]; // 用于存储没有空格的结果字符串的数组
char *p = str; // 指向输入字符串的指针
char *q = result; // 指向结果字符串的指针
printf("请输入一个字符串:");
gets(str); // 使用 gets 获取输入字符串
// 如果存在换行符,则将其移除
while (*p != '\0')
{
if (*p == '\n')
{
*p = '\0';
break;
}
p++;
}
p = str; // 重置指针到字符串开头
// 处理字符串以删除空格
while (*p != '\0')
{
if (*p != ' ')
{
*q = *p;
q++;
}
p++;
}
*q = '\0'; // 终止结果字符串
printf("删除空格后的字符串:%s\n", result);
return 0;
}
解释:
- 第327行:定义主函数
main
。 - 第329行:声明字符数组
str
用于存储输入的字符串。 - 第330行:声明字符数组
result
用于存储没有空格的结果字符串。 - 第331行:声明指针
p
并初始化为指向str
。 - 第332行:声明指针
q
并初始化为指向result
。 - 第334行:提示用户输入一个字符串。
- 第335行:使用
gets
函数获取输入字符串并存储在str
中。 - 第336-344行:检查并移除字符串中的换行符。
- 第345行:将指针
p
重置为指向str
的开头。 - 第347-356行:遍历字符串
str
,并将非空格字符复制到result
中。 - 第357行:在
result
末尾添加空字符'\0'
以终止字符串。 - 第358行:打印删除空格后的字符串。
- 第359行:返回 0,表示程序正常结束。