C语言学习——5

补充知识点:

1.gcc 编译的四个步骤

  1. 预处理:头文件展开,宏定义的替换 ,去除注释、条件编译等

    gcc -E 1.c -o 1.i
    
  2. 编译: 检查语法错误后,没有错误在生成汇编文件 .s

    gcc -S 1.i -o 1.s
    
  3. 汇编:把汇编代码编译成机器码

    gcc -c 1.s -o 1.o
    
  4. 链接:把相关的库 和 所有的.o文件链接在一起生成可执行文件

gcc 1.o -o app

2.刷新缓冲区

  1. 程序结束(正常结束)
  2. \n 刷新缓冲区
  3. 缓冲区满

一、指针数组

/*
是一个数组,存储的是指针
一般形式:
	存储类型	数据类型	*数组名[元素个数];
*/
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;
} 

运行截图

alt

alt

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 = &pi;
printf("%f",*(double *)p);

(4).二级指针(多级指针)

//指针的指针 : 存指针的地址编号的变量
int a = 10;
int *p = &a;
int **q = &p;
printf("%d\n",**q);		//输出 10;

alt

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;