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关键字可以延长变量的生命周期,使得这个变量在整个程序结束之前不会被销毁。

相关推荐
Zixhy10 分钟前
手撕Reactor模型实现同步高并发服务器及Muduo网络库深入解析
linux·服务器·网络·数据库·c++
码匠许师傅8 小时前
【设计模式精讲】29.行为型模式总结与对比(Behavioral Patterns Summary)
c++·设计模式·uml
码事漫谈8 小时前
多人共用一个 key,缓存命中率会不会因此降低?
后端
啦啦啦啦啦zzzz8 小时前
Logger的组装(c++20)
c++·算法·c++20
考虑考虑8 小时前
docker compose环境变量替换
运维·后端·自动化运维
武雄(小星Ai)9 小时前
飞书API上传26MB文件偶发失败:错误码9499与空响应体排坑实录
后端·api·排坑实录
徐小夕10 小时前
JitWord 4.0 万字分享:从协同工具到AI Word操作系统,聊聊3年产品创业史
前端·vue.js·后端
繁星蓝雨10 小时前
C++的设计与演进大纲(如何从C语言一步步成长为C++)
c语言·开发语言·c++·c++历史·c++演进
蒸蒸yyyyzwd10 小时前
机试学习笔记
c++·求职招聘
geovindu11 小时前
CSharp: Observer Pattern
开发语言·后端·观察者模式·设计模式·c#·.netcore·行为模式