C语言学习——5
补充知识点:
1.gcc 编译的四个步骤
-
预处理:头文件展开,宏定义的替换 ,去除注释、条件编译等
gcc -E 1.c -o 1.i
-
编译: 检查语法错误后,没有错误在生成汇编文件 .s
gcc -S 1.i -o 1.s
-
汇编:把汇编代码编译成机器码
gcc -c 1.s -o 1.o
-
链接:把相关的库 和 所有的.o文件链接在一起生成可执行文件
gcc 1.o -o app
2.刷新缓冲区
- 程序结束(正常结束)
- \n 刷新缓冲区
- 缓冲区满
一、指针数组
/*
是一个数组,存储的是指针
一般形式:
存储类型 数据类型 *数组名[元素个数];
*/
int *p[5];
eg
int a = 10 , b = 20 , c = 30;
int *p[3] = {&a ,&b , &c};
*p[0]; //访问到的a ([]优先级高于*)
char *p[3] = {"hello","world","xxxx"};
puts(p[0]); //输出hello,这里的p[0]是指针,指向的是hello的首地址
练习
//排序打印字符串,从短到长
char str1[32] = "hello world";
char str2[32] = "ni hao";
char str3[32] = "welcome to chengdu";
char str4[32] = "xxx";
/*===============================================
* 文件名称:eg1.c
* 创 建 者:青木莲华
* 创建日期:2025年07月18日
* 描 述:
================================================*/
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char str1[32] = "hello world";
char str2[32] = "ni hao";
char str3[32] = "welcome to chengdu";
char str4[32] = "xxx";
char *p[4] = {str1,str2,str3,str4};
char *temp;
for(int i = 0 ; i < 3 ; i++)
{
for(int j = i + 1 ; j < 4 ; j++)
{
if(strlen(p[i]) > strlen(p[j]))
{
temp = p[i];
p[i] = p[j];
p[j] = temp;
}
}
}
for(int i = 0 ; i < 4 ; i++)
{
puts(p[i]);
}
return 0;
}
运行截图
1.指针数组与二维数组的关系
int a[3][4] = {1,2,3,4,
5,6,7,8,
9,10,11,12};
int *p[3] = {a[0],a[1],a[2]};
p[i][j] = a[i][j];
2.特殊的指针
(1).野指针
//1.野指针,指向不明确的指针,野指针一旦使用,就会段错误
int *p;
(2).空指针
//2.空指针,指向零地址(NULL)的指针,被称为空指针。空指针一旦使用就会段错误
int *p = NULL;
(3).空类型指针(万能指针)
/*
3.空类型指针(万能指针) ----- void
(1)可以指向任意数据类型
(2)使用对应空间的时候,需要转换相应的类型
*/
int a = 10;
double pi = 3.14;
void *p = &a;
printf("%d",*(int *)p);
p = π
printf("%f",*(double *)p);
(4).二级指针(多级指针)
//指针的指针 : 存指针的地址编号的变量
int a = 10;
int *p = &a;
int **q = &p;
printf("%d\n",**q); //输出 10;
3.const关键字
(1).修饰变量
//1.修饰变量 不可以被直接修改(只能在初始化的时候赋值 或者 使用指针修改内存中存储的信息)
const int a = 10;
//可通过指针修改
int *p = &a;
*p = 12345;
//输出会报警告
printf("%d\n",a); //输出值为12345
(2).修饰指针
/*
指针常量 : (指针是一个常量)
指针的指向不可以被修改
指针指向的内容可以被修改
*/
int * const p;
/*
常量指针 : (常量的指针)
指针的指向可以被修改
指针指向的内容不可以被修改
*/
const int *p;
int const *p;