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

C基础学习过程02

文章目录

  • 一、指针的概念与定义
    • 1.1 指针的概念
    • 1.2 指针的定义
    • 1.3 指针的初始化
    • 1.4 指针的调用
    • 1.5 指针的赋值
      • 练习-倒序打印字符
    • 1.6 万能指针

一、指针的概念与定义

1.1 指针的概念

  • 内存上一片空间的地址
  • 指针就是地址,地址就是指针
  • 什么是地址?
    内存被划分为一个个字节的存储单元,每个字节都有一个唯一的编号,这个编号就是地址,用于标识内存中的具体位置。
  • 指针:轻量级的作用,方便我们操作地址

1.2 指针的定义

  • 一般形式:
    存储类型 数据类型 *指针变量名;
  • 例如:int *p;
  • 说明:
    存储类型是指针的存储类型,数据类型是指针指向对象的数据类型
  • 指针的大小:
    指针的大小和数据类型没有关系,和操作系统位数有关,64位操作系统下指针大小为8byte,32位操作系统下指针大小为4byte。
#include <stdio.h>int main(int argc, char *argv[])
{printf("%ld\n", sizeof(char *));printf("%ld\n", sizeof(int *));printf("%ld\n", sizeof(double *));return 0;
}

* :指针的标志,在定义和初始化时 * 表示后面这个变量为指针变量
指针变量名:标识符,遵守变量名命名规则,一般指针指针变量名统称为指针

1.3 指针的初始化

一般形式:

存储类型 数据类型 *指针变量名 =
例如:int a = 1
int *p = a

#include <stdio.h>int main(int argc, char *argv[])
{int a = 1; // 初始化aint *p = &a;  // 初始化指针printf("a=%p\n", &a); // a的首地址printf("p=%p\n", p);  // 存储a的首地址printf("&p=%p\n", &p); // 指针p本身的地址return 0;
}

1.4 指针的调用

  • *:取内容符,用于获取指针所指向地址上的内容。
  • *&互为逆运算。
  • 一般形式:*指针变量名

地址具有唯一性

#include <stdio.h>int main(int argc, char *argv[])
{int a = 4;int *p = &a;printf("a=%d\n", a);printf("*(&a)=%d\n", *(&a));printf("*p=%d\n", *p);return 0;
}
// a=4
// *(&a)=4
// *p=4

1.5 指针的赋值

  1. 已知变量的地址
int a = 4;
int *p = &a;
  1. 把NULL赋值给指针,空地址(相当于指针的初始化为0x0000 0000)

    • 防止野指针出现(没有指向的指针)
  2. 把数组的首地址赋值给指针

#include <stdio.h>int main(int argc, char *argv[])
{int a[5] = {12, 34, 56, 78, 90};// 数组名a代表数组的首地址,即&a[0],将其赋值给指针p,使p指向数组的第一个元素int *p = a; printf("a[3]=%d\n", a[3]);// 通过指针p的偏移来访问数组元素,p+3指向数组的第4个元素(下标从0开始),* (p+3)获取该元素的值printf("*(p+3)=%d\n", *(p+3));printf("p[3]=%d\n",p[3]);printf("*(a+3)=%d\n"(a+3));return 0;
}

a. * 和 [ ] 可以互换
数组名和指针变量名可以互换,但是数组名是一个常量,指针变量名是一个变量

#include <stdio.h>int main(int argc, char *argv[])
{int a[5] = {12, 34, 56, 78, 90};int *p = a; //相当于int *p = &a[0];数组名代表数组的首地址printf("*(p+1)=%d\n", *(p+1)); // 34   因为p+1让下标0->1,但是p本身没有变化 所以34printf("*p++=%d\n", *p++); // 12printf("*p=%d\n", *p); // 34   因为p++让下标0->1 所以34printf("*a++=%d\n", *a++);return 0;
}
  1. 把同级指针赋值给指针
#include <stdio.h>int main(int argc, char *argv[])
{int a = 4;int *p = &a;int *q = p;printf("a=%d\n", a);printf("*p=%d\n", *p);printf("*q=%d\n", *q);return 0;
}

练习-倒序打印字符

#include <stdio.h>
#include <string.h>int main(int argc, char *argv[])
{char a[128] = {0};gets(a); // 输入字符串char *p = a;int i; // 交换的次数char temp; // 中间变量int len = strlen(a);for (i = 0; i < len / 2; i++){temp = *(p + i);*(p + i) = *(p + len - 1 - i);*(p + len - 1 - i) = temp;}puts(a);return 0;
}

1.6 万能指针

可以指向任意数据类型的指针
void 修饰的指针
void *p;
但是在调用取值的时候需要强转成你指向的数据类型

#include <stdio.h>int main(int argc, char *argv[])
{int a = 10;void *p = &a;printf("%d\n", *((int *)p));return 0;
}
http://www.dtcms.com/a/604906.html

相关文章:

  • 视频矩阵哪个品牌好 十大视频矩阵品牌
  • 电子书《21天学通Java(第5版)》
  • maven 私服上传jar
  • 从自动驾驶到智能辅导:人工智能如何重塑商业与生活
  • Hadess入门到精通 - 如何管理通用Generic制品
  • 万物互联时代,如何选择合适的时序数据库?
  • 集团门户网站建设做国外网站要注意什么
  • 软件设计模式-适配器模式
  • 软件工程(速成笔记)
  • 深圳苏州企业网站建设服务公司网站建设很难吗
  • sward实战教程系列(4) - 如何编写Markdown文档
  • 树莓派5-ubuntu 24.04 ros-jazzy-desktop 创建 robot_navigation 包
  • 【Linux】调试监听接口是否正常
  • Flink CDC + StarRocks用 StarRocks Connector 打通实时明细与分析
  • Linux《Socket编程Tcp》
  • 2025.11.13 力扣每日一题
  • “暗激子(dark excitons)” 以 30万倍亮度被观测到
  • 数据归一化:提升模型训练的关键技巧
  • 网站外链建设可以提升网站权重对吗三亚平台公司
  • 怎么做一种网站为别人宣传lamp 做网站
  • UE5制作扭曲声波效果
  • 从 OneThreadOneLoop 线程池到进程池:高性能 Reactor 服务器的演进
  • C语言在线编译环境 | 提高编程效率与学习体验
  • 矩阵起源成功登陆深圳“专精特新”专板,加速 AI 数据智能新进程!
  • MPC模型预测控制原理全解析:从状态预测、矩阵推导到QP求解与滚动优化(含完整手推过程)
  • android recyclerview缓存2_四级缓存机制
  • [特殊字符] 在 macOS 上设置 SQLite
  • android recyclerview缓存1_概念和常见问题
  • SQLite 速成学习
  • [特殊字符] 在 Windows 上设置 SQLite