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

相关推荐
paopaokaka_luck1 小时前
基于SpringBoot+Uniapp的健身饮食小程序(协同过滤算法、地图组件)
前端·javascript·vue.js·spring boot·后端·小程序·uni-app
Villiam_AY2 小时前
Redis 缓存机制详解:原理、问题与最佳实践
开发语言·redis·后端
朝朝又沐沐5 小时前
算法竞赛阶段二-数据结构(36)数据结构双向链表模拟实现
开发语言·数据结构·c++·算法·链表
魔尔助理顾问5 小时前
系统整理Python的循环语句和常用方法
开发语言·后端·python
程序视点5 小时前
Java BigDecimal详解:小数精确计算、使用方法与常见问题解决方案
java·后端
你的人类朋友5 小时前
❤️‍🔥微服务的拆分策略
后端·微服务·架构
逝雪Yuki5 小时前
Leetcode——287. 寻找重复数
c++·leetcode·二分查找·双指针·环形链表
李永奉7 小时前
C语言-流程控制语句:for循环语句、while和do…while循环语句;
c语言·开发语言·c++·算法
AI小智7 小时前
后端变全栈,终于可以给大家推出我的LangChain学习小站了!
后端
打码农的篮球7 小时前
STL——list
开发语言·c++·list