C语言指针Pointers

1.什么是指针Pointers

指针就是内存地址。我们可以通过这个内存地址获取到对应变量的值,并可以进行修改。也就是说指针(变量)就是存着内存地址的变量,就是说指针也是一种变量。

2.指针的定义

格式:

c 复制代码
数据类型 * 变量名
  • 数据类型要跟该指针指向的数据类型一致。

比如指向的是整形类型:

c 复制代码
int* p1;
float* p2;
  • *没有别的意义,就是一种标记,表示该变量是指针变量。

注意:不能把一个数值赋值给指针变量,比如下面这种写法是错误的:

c 复制代码
int* p = 500;

这种写法意味着指针把这个500当作内存地址来处理,这样随便分配内存地址是不对的。

3.指针的作用

  1. 查询数据
  2. 存储数据
  3. 参数传递
  4. 内存管理
  5. 等等。。。

①查询数据

我们可以通过指针查询数据:

c 复制代码
#include<stdio.h>  
  
int main() {  
    int a = 10;  
    // 把变量a的内存地址给指针变量p,因为指针就是存储内存地址的变量  
    // 指针p就指向了变量a
    int* p = &a;   
    
    // 这里的 * 是解引用运算符,就是获取p存储的内存地址里面的变量
    printf("%d", *p);
    
    return 0;
}

输出:10

比如如果我们直接输出p,输出的是a的内存地址:

c 复制代码
#include<stdio.h>  
  
int main() {  
    int a = 10;  
    int* p = &a;      
      
    printf("%d\n", &a);  
    printf("%d", p);
    
    return 0;
}

输出:

text 复制代码
-2004878924
-2004878924

②操作其它函数中的变量

比如交换两个变量的值,如果要求定义一个自定义函数swap来完成两个变量值的交换,应该怎么写呢?

应该这样写:

c 复制代码
#include<stdio.h>  
  
void swap(int* p1, int* p2);  
  
int main() {  
    int a,b;  
    printf("输入a:");  
    scanf("%d", &a);  
    printf("输入b:");  
    scanf("%d", &b);  
      
    swap(&a, &b);  
    printf("a=%d\n", a);  
    printf("b=%d\n", b);  
    
    return 0;
}  
  
void swap(int* p1, int* p2) {  
    int temp;  
      
    temp = *p1;  
    *p1 = *p2;  
    *p2 = temp;  
}

需要注意的小细节:

函数调用结束以后,该函数里面的所有变量都会销毁。用自定义函数返回一个指针,如果这样写:

c 复制代码
#include<stdio.h>  
  
int* method();  
  
int main() {  
    int* p = method();  
      
    printf("拖延一点时间...\n");  
    printf("拖延一点时间...\n");  
    printf("拖延一点时间...\n");  
    printf("拖延一点时间...\n");  
      
    printf("%d\n", *p);  
    return 0;  
}  
  
int* method() {  
    int a = 10;  
    return &a;  
}

这段代码不能打印出*p的值,因为该指针指向的变量已经被销毁。

我们可以使用static来解决这个问题:

c 复制代码
#include<stdio.h>  
  
int* method();  
  
int main() {  
    int* p = method();  
      
    printf("拖延一点时间...\n");  
    printf("拖延一点时间...\n");  
    printf("拖延一点时间...\n");  
    printf("拖延一点时间...\n");  
      
    printf("%d\n", *p);  
    return 0;  
}  
  
int* method() {  
    // 加上static关键字  
    static int a = 10;  
    return &a;  
}

static关键字可以延长变量的生命周期,使得这个变量在整个程序结束之前不会被销毁。

相关推荐
bobz9656 小时前
小语言模型是真正的未来
后端
mit6.8246 小时前
[openvela] Hello World :从零开始的完整实践与问题复盘
c++·嵌入式硬件
DevYK7 小时前
企业级 Agent 开发实战(一) LangGraph 快速入门
后端·llm·agent
一只叫煤球的猫7 小时前
🕰 一个案例带你彻底搞懂延迟双删
java·后端·面试
冒泡的肥皂8 小时前
MVCC初学demo(一
数据库·后端·mysql
啊阿狸不会拉杆8 小时前
《算法导论》第 32 章 - 字符串匹配
开发语言·c++·算法
小学生的信奥之路8 小时前
洛谷P3817题解:贪心算法解决糖果分配问题
c++·算法·贪心算法
颜如玉8 小时前
ElasticSearch关键参数备忘
后端·elasticsearch·搜索引擎
曙曙学编程9 小时前
stm32——GPIO
c语言·c++·stm32·单片机·嵌入式硬件
△曉風殘月〆9 小时前
Visual Studio中的常用调试功能(下)
c++·ide·visual studio·调试