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

相关推荐
Hooray3 小时前
2026年,站在职业生涯十字路口的我该何去何从?
前端·后端
唐叔在学习3 小时前
还在申请云服务器来传输数据嘛?试试P2P直连吧
后端·python
m0_748250033 小时前
C++ 官方文档与标准
开发语言·c++
开心猴爷4 小时前
iOS 代码混淆在项目中的方式, IPA 级保护实践记录
后端
matlabgoodboy4 小时前
程序代做python代编程matlab定制代码编写C++代写plc设计java帮做
c++·python·matlab
魅影骑士00104 小时前
柯里化函数
后端·设计模式
DYS_房东的猫4 小时前
《 C++ 零基础入门教程》第6章:模板与 STL 算法 —— 写一次,用万次
开发语言·c++·算法
点云SLAM4 小时前
C++ 静态初始化顺序问题(SIOF)和SLAM / ROS 工程实战问题
开发语言·c++·slam·静态初始化顺序问题·工程实战技术·c++static 关键字
JOEH604 小时前
🛡️ 微服务雪崩救星:Sentinel 限流熔断实战,3行代码搞定高可用!
后端·全栈
aiopencode5 小时前
iOS手动代码混淆函数和变量名基本原理和注意事项教程
后端