C指针 篇1

开始复习和进阶C指针,

本文主要内容参考:https://labspc.gitbook.io/cnippets/chap5.-zhi-zhen-yu-shu-zu

《C指针编程之道》ISBN 9787115250841

1. 指针变量的大小

指针变量存的是什么?存的是一个地址,所以说你给指针变量指定了类型,但是根本不影响,它本身只是一个地址,它的大小和你这个指定的类型的大小是没有关系的。指针变量的大小和机器的位数是有关系的, 指针即地址,32位机、64位机,就是说这个地址是32比特位、64个比特位,x64平台下,指针变量的大小,就是64个比特位,也就是8字节。

img

img

注意:指针是常量,因为是地址;指针变量是变量,二者概念不同。

2. 指针变量的定义与赋值

2.1 定义

datatype *pointer_name;

其中,datatype 是指针所指向的数据类型,pointer_name 是指针变量的名称。例如,如果你想定义一个指向整数的指针变量,可以这样写:

int *ptr;

2.2 赋值

int num = 10;
int *ptr;
ptr = # // 将ptr指向num的地址

指针变量仅能存放某个地址,可以取址,但是不能直接指定值

img

注意:我们要清楚,指针变量存的是地址,取出来的也是地址。

此外,可以初始化为 0,空指针,不指向任何东西。

int *ptr = 0;
int *ptr = NULL;

2.3 取值与取址

  1. 取值 (Dereferencing):
    • 英文:Dereferencing
    • 意义:取得指针所指向的值
    • 用法:使用解引用运算符 * 来执行
    • 示例:如果 ptr 是一个指向整数的指针,那么 *ptr 表达式将取得指针 ptr 所指向的整数值。
  2. 取址 (Address-of):
    • 英文:Address-of
    • 意义:取得变量的地址
    • 用法:使用取址运算符 & 来执行
    • 示例:如果 num 是一个整数变量,那么 &num 表达式将取得变量 num 在内存中的地址。

如果要说取值* 的话,解引用运算符 * 是用来访问指针所指向的值的。换句话说,当你有一个指针指向某个内存地址时,使用 * 可以获取该内存地址上存储的值。 来看代码:

int num;
int *pnum;
punm=#
*punm=5;

第4句*pnum 解引用了指针 pnum,获取了它所指向的值,也就是变量 num 的值。用解引用运算符 * 完成间接访问变量num,并完成赋值。

注意:不要问为什么,写法就是这么个写法。我第一次学的时候也想问为什么,不要问为什么,我们就是在学规则,学用法。

3. 指针辨析:(&*p)(*&p) 的区别

通过这个例子,可以知道p本身存的值就是一个地址,而p本身在内存中也有自己的地址,因为此时的p是变量。

而后,再来看(&*p)(*&p) 二者的区别,只要记住是“右结合”的就行。

#include <stdio.h>

int main() {
    int i = 10;
    int *p = &i;

    printf("Value of p: %p\n", p);
    printf("Address of p: %p\n", &p);
    printf("Address of i: %p\n", &i);

    printf("\n(&*p) = %p\n", (&*p));
    printf("(*&p) = %p\n", (*&p));

    return 0;
}

笔记:这里,本地调试一下,仔细琢磨输出,理解下指针、指针变量、指针变量的值、指针变量的地址等细节。

截屏2024-03-25 09.16.00

4. 地址运算

C语言支持 3 种格式的指针算术运算:

  • 指针加上整数
  • 指针减去整数

前两种就是指针的移动:

p=&a[2];
q=p+3;
  • 两个指针相减
#include <stdio.h>
#include <stddef.h>

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int *ptr1 = arr; //指向首元素 1
    int *ptr2 = &arr[3]; //指向第4个元素 4

    // 计算指针之间的偏移量
    ptrdiff_t diff = ptr2 - ptr1;

    printf("指针之间的偏移量为:%td\n", diff);

    return 0;
}
/* 
  ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
  │ ptrdiff_t 是C语言标准库 <stddef.h> 中定义的一个整数类型,用于存储指针之间的偏移量。                                                           │
  │ 在上面的示例中,我们使用 %td 格式说明符来打印 ptrdiff_t 类型的值。 
  | OUTPUT:      
  | 指针之间的偏移量为:3                                                                │
  └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
 */

下图见动态演示:

相关推荐

浅谈:C, ASM & Register

主要参考书籍: 《微机原理与接口技术》 ISBN:9787302446453 《C指针编程之道》 ISBN:9 ...

C指针 篇2

指针在函数的应用 参考 《C指针编程之道》ISBN 9787115250841 主要内容如下: 指针作为函数参 ...

深入C++笔记 篇2

0.目录 什么是拷贝 拷贝需要考虑的几个问题 C++中的拷贝概念及操作 现代C++11 中的移动语义和右值引用 ...

暂无评论

发表评论

您的电子邮件地址不会被公开,必填项已用*标注。