当前位置: 首页 > article >正文

C语言基础知识04

指针

指针概念

        指针保存地址,地址是字节的编号

        指针类型和保存的地址类型要一直

        使用时注意,把地址转换为&变量的格式来看        int a[3];  a转为&a[0]

指针的大小

        64bit        固定8字节,        32bit        固定4字节

指针的定义

        格式:数据类型 变量名

        指针的标识:

        int a;

        int a[3];  先写单个变量,变量名后加[]和元素个数

        int *a;  先写单个变量,在变量名后面加*,表示指向该空间类型的指针

        空间类型==地址类型==数据类型

多级指针

指针的初始化

        指针不初始化--野指针,应避免野指针的出现

        int *p=NULL;

int a=5;
int *p=&a;//初始化直接指向变量地址
char *p= “hello”;
char a[10]= “hello”;

指针的使用

        * 乘法 双目 1*2 

        * 解指针/解地址 单目 *地址 

        & 取地址 同空间变量获取空间的地址 

        * 解地址 通过空间地址找到空间变量 

        所以*&可以抵消

int a=5;
int *p=&a;
int **q=&p;
int ***k=&q;
printf(“%d”, a);//5
printf(“%d”, *p);//5
printf(“%d”, **q);//5
printf(“%d”, ***k);//5

类型转换

        数据转换:自动转换,自动向高精度转换

                强制转换:float a=3.14; printf("%d", (int)a);

        地址转换/空间类型转换:强制转换

int a=65;
char *p=(char *)&a;// &a 代表 4 字节空间地址 (char *)强制转换为 1 字节空间地址
if(*p == 65)
{
printf(“小端\n”);
}

大小端

        低位地址存高位数据        大端存储

        低位地址存低位数据        小端存储

        数据在进行网络传输时,尤其是跨平台和设备,会出现存储方式不同而引起的数据错误,所以在发送数据之前需要进行大小端测试

地址偏移

        地址加减,加减的是空间个数,空间的大小由空间类型决定

int a[5][20];
int *p=&a[0][0];
p+1 == &a[0][0]+1 == &a[0][1]
(int (*)[20])p+1 == &a[0]+1 == &a[1]
int (*q)[20]=&a[0]; // sizeof(q)==8
变量 q 先与*结合,所以 q 是指针
再与[20]结合,所以指针指向数组,数组有 20 个元素
最后与 int 结合,所以数组元素是整型变量
q+1 == &a[0]+1 == &a[1]
(int *)q+1 == &a[0][0]+1 == &a[0][1]

指针常量&&常量指针

关键字:const
功能:修饰变量为常量
int *p; // 整型指针
float *p; // 浮点型指针
char *p; // 字符指针
常量指针:指向常量的指针
数字常量 字符常量 字符串常量
指针常量:指针自己是常量
const char *p;//常量指针 const 修饰*p,指针指向的空间是常量
char const *p;//常量指针
char * const p;//指针常量 const 修饰 p,指针自身是常量
const char * const p;//常量指针常量

指针数组&&数组指针

int a[5];// 整型数组
float a[5];// 浮点型数组
char a[5];// 字符数组
指针数组:由指针组成的数组
int *a[5];// 整型指针数组
char *a[5];// 字符指针数组
数组指针:指向整个数组的指针
int (*p)[5];// 整型数组指针
int a[2][3];
int (*p[2])[3]; // 整型数组指针数组
p[0]=&a[0];
p[1]=&a[1];

二维字符数组&&字符指针数组

char a[3][5]={“123”, “456”, “789”}; // 二维字符数组
    a 字节大小:15
char *a[3]={“123789”, “456789”, “7896666666”}; // 字符指针数组
    a 字节大小:24
    printf(“%s\n”, a[1]+1); // 56789

附面试题:

1、地址为0x80000020的内存段存储一个浮点型数据3.14

        float *p(float *)0x80000020;

        *p = 3.14;

2、

unsigned char *p=0x10000010;

(unsigned long *)p+2=0x10000020;

(unsigned long)p+2=0x10000012;

(char (*)[5])p+2=0x1000001A;

(short (**))p+2=0x10000020;

3、

#include <stdio.h>
int main()
{
     char *p = "%s,%d\n";
     char *a = "hello";
     printf(p,a,36);
     printf(p+3,36);
     printf("%s,%d\n","hello",36);
     return 0;
}


http://www.kler.cn/a/586366.html

相关文章:

  • 人工智能与人的智能,改变一生的思维模型分享【4】决策树
  • 有效的括号 力扣20
  • fprintf() 函数:C语言中的文件格式化输出利器
  • 机器学习_交叉验证
  • 大语言模型基础之‘显存优化‘
  • 【2025】Electron Git Desktop 实战一(上)(架构及首页设计开发)
  • 网络华为HCIA+HCIP数据链路层协议-以太网协议
  • uv命令介绍(高性能Python包管理工具,旨在替代pip、pip-tools和virtualenv等传统工具)
  • 设计一个高性能的分布式限流系统
  • ArcGIS Pro将有文字标注底图切换为无标注底图(在线地图图源)
  • PostgreSQL的学习心得和知识总结(一百七十一)|深入理解PostgreSQL数据库之 外连接消除 的使用和实现
  • 日本IT|AWS工作内容及未来性、以及转职的所需资质和技能
  • 三分钟掌握音视频处理 | 在 Rust 中优雅地集成 FFmpeg
  • go GRPC学习笔记
  • 工业相机视频播放(RTSP)
  • STM32Cubemx-H7-7-OLED屏幕
  • OkHttp 的证书设置
  • 蓝桥杯——路标设置
  • Celery - 入门(get-started)
  • 精准车型识别:视觉分析技术的力量