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

相关推荐
John_ToDebug4 小时前
Chromium回调机制的隐秘角落:当const &参数遇见base::BindOnce
c++·chrome·性能优化
消失的旧时光-19434 小时前
C++ 拷贝构造、拷贝赋值、移动构造、移动赋值 —— 四大对象语义完全梳理
开发语言·c++
jbtianci5 小时前
Spring Boot管理用户数据
java·spring boot·后端
cpp_25015 小时前
P8448 [LSOT-1] 暴龙的土豆
数据结构·c++·算法·题解·洛谷
MSTcheng.5 小时前
【C++】C++智能指针
开发语言·c++·智能指针
那我掉的头发算什么5 小时前
【Mybatis】Mybatis-plus使用介绍
服务器·数据库·后端·spring·mybatis
云深处@5 小时前
【C++11】部分特性
开发语言·c++
会算数的⑨5 小时前
Kafka知识点问题驱动式的回顾与复习——(一)
分布式·后端·中间件·kafka
独望漫天星辰5 小时前
C++ 树结构进阶:从工程化实现到 STL 底层与性能优化
开发语言·c++
HellowAmy5 小时前
我的C++规范 - 鸡蛋工厂
开发语言·c++·代码规范