首页 > 其他分享 >C语言指针笔记

C语言指针笔记

时间:2024-07-18 20:29:44浏览次数:8  
标签:dist 变量 int 笔记 C语言 yp xp 指针

该笔记整理自 阮一峰老师的《C语言教程》和部分网上资料

什么是指针

指针就是一个代表某个内存地址的值

声明和初始化指针变量

int a = 10;
// 声明一个指针变量p,并将a的地址赋给p
int* p = &a;

// 输出p的值(地址值)
printf("%p", p);
// 输出p所指向的值
printf("%d", *p);

这个*可以放在数据类型和变量名之间的任意位置,比如int * p;int *p;等等,不过为了体现p是一个指针变量,建议int* p;
%p占位符表示一个指针变量

野指针

野指针就是 一个指向位置地址或者没有指向任何地址的指针

野指针如何产生的?

  1. 指针变量未经初始化,则该指针会随机指向一个内存地址,因此应该尽量给指针变量初始化,哪怕是NULL
  2. 给指针变量赋值为NULL
  3. 指针所指向的值被释放掉了

指针与数字加减

一般用于数组指针或者字符串指针

int* p = (int*) 0x100;
p += 2; // 此时p的值为0x108,因为指针偏移量和其数据类型一致,int类型的指针偏移量为4

使用指针遍历打印数组里的元素

int arr[] = {1, 2, 3, 4, 5};
int* p = arr; // 此时p指向arr的第一个元素1
for (int i = 0; i < sizeof(arr) / sizeof(int); i ++) {
  printf("%d\n", *p);
  p ++;
}

指针之间的加减

指针之间的加法是违法的,会报错

但是相同类型的指针之间的减法是合法的

int* p1 = (int*) 0x1009;
int* p2 = (int*) 0x1000;

int dist = p1 - p2; // dist的值为3
// 分析:因为 0x1009 - 0x1000 = 9
// int占4字节,所以 9 / 4 = 2 ... 1,多出来1位,这个多出来的1位被包含在第三个int元素里,所以dist值为3

但是dist可能会超过int的范围,所以为了程序的健壮性,建议这么写

#include <stddef.h>

int main() {
  int* p1 = (int*) 0x1009;
  int* p2 = (int*) 0x1000;

  ptrdiff_t dist = p1 - p2;

  return 0;
}

ptrdiff_t类型专门被设计用来表示两个指针之间的距离的,使用这种类型之前,需要引入stddef.h

踩雷日志

交换两个变量的值,错误代码:

int change(int x, int y) {
  int* xp = &x;
  int* yp = &y;

  *xp = *xp ^ *yp;
  *yp = *xp ^ *yp;
  *xp = *xp ^ *yp;
}

错误点:忘记基本数据类型的传参方式为值传递,即 新开一个空间,将值赋值进去,再让参数指向新的空间
正确代码:

int change(int* x, int* y) {
  *x = *x ^ *y;
  *y = *x ^ *y;
  *x = *x ^ *y;
}

标签:dist,变量,int,笔记,C语言,yp,xp,指针
From: https://www.cnblogs.com/LanceWorkstaion/p/18310387

相关文章

  • c++ primer plus 第16章string 类和标准模板库,16.2.1 使用智能指针
    c++primerplus第16章string类和标准模板库,16.2.1使用智能指针c++primerplus第16章string类和标准模板库,16.2.1使用智能指针文章目录c++primerplus第16章string类和标准模板库,16.2.1使用智能指针16.2.3uniqueptr为何优于autoptr16.2.3unique......
  • c++ primer plus 第16章string 类和标准模板库,16.2.2 有关智能指针的注意事项
    c++primerplus第16章string类和标准模板库,16.2.2有关智能指针的注意事项c++primerplus第16章string类和标准模板库,16.2.2有关智能指针的注意事项文章目录c++primerplus第16章string类和标准模板库,16.2.2有关智能指针的注意事项16.2.2有关智能指针的......
  • 嵌入式学习——C语言字符数组及其函数
    目录一、字符数组    1、定义    2、初始化                    3、引用字符数组元素二、字符串和字符串结束的标志三、字符数组的输入输出        1、字符串的输入:scanf    2、注意事项四、字符串处理函数......
  • 扩展 KMP/exKMP(Z 函数)学习笔记
    声明本文章转载自shangruolin的博客,已经过作者(存疑)同意,帮TA宣传一下。扩展KMP/exKMP(Z函数)学习笔记兼P10479匹配统计题解。LCP:最长公共前缀。Z函数,又称扩展KMP(exKMP),能够在\(O(n)\)的时间内求出一个字符串与其所有后缀的LCP的长度。定义\(z_i\)为字符串\(s\)......
  • Datawhale AI 夏令营——CPU部署大模型(LLM天池挑战赛)——Task2与3学习笔记
        Task2的任务是组队+寻找灵感,这里不作阐述;Task3的任务是实现RAG应用,阅读文档并观看卢哥的直播后,结合个人经验做个分享。    运行大语言模型,对LLM使用的加深,我们发现,在使用过程中,大模型会有很多幻觉出现。为了解决幻觉,科研人员提出了各种各样的方案......
  • 【C语言】结构体,枚举,联合超详解!!!
    目录结构体结构体声明结构体成员的访问结构体自引用 结构体变量定义,初始化,传参 结构体内存对齐 位段枚举联合(共用体)结构体结构体声明1.概念1.结构体是一些值的集合,这些值称为成员变量。2.结构体的每个成员可以是不同类型的变量。3.数组:一组相同类型......
  • 什么是信息指纹和信息加密——《数学之美》第16、17章以及其他各种资料的读书笔记
    目录1.信息指纹1.1概念1.2相关算法的演进历程1.3 哈希碰撞1.4 雪崩效应1.5 应用场景2.信息加密2.1密码学的简要历史2.1.1古代密码学:智慧的萌芽2.1.2 中世纪至文艺复兴:密码术的兴起2.1.3 近代密码学:机械密码机的诞生2.1.4 现代密码学:复杂科学的诞生2.......
  • C语言 指针方法 输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对
    输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写3个函数:第一个:输入10个数;第二个:进行处理;第三个:输出10个数。#include<stdio.h>voidinputNumbers(int*arr){printf("Enter10integers:");for(inti=0;i<10;i++){......
  • C语言 指针方法 输入3个整数,按由小到大的顺序输出
    输入3个整数,按由小到大的顺序输出#include<stdio.h>voidsortIntegers(int*a,int*b,int*c){if(*a>*b){inttemp=*a;*a=*b;*b=temp;}if(*a>*c){inttemp=*a;*a=*c;*c=temp......
  • JavaWeb笔记_Response对象
    一.Response对象1.1Response对象概述a.专门负责给浏览器响应信息(响应行,响应头,响应体)的对象b.我们主要使用的是跟HTTP协议相关的Response对象:HTTPServletResponse,继承了ServletResponse,扩展了ServletResponse接口,提供了更多的方法,例如可以操作响应头,cookie等1.2Response......