c语言指针(完)

内容概要

  一、指针的基本用法

  二、指针的工作原理

  三、注意的问题

 

1、指针的基本用法

复制代码
#include <stdio.h>

int main(){
    int *pa;  //定义整形指针变量,指针只能是其它整形变量的内存地址
    int num = 10;
    pa = &num; //&获取整形变量的内存地址,将它赋值给pa指针变量作为指针
    printf("%p, %p, %d", &pa, pa ,*pa);    //获取指针变量的内存地址;获取指针变量存储的指针;获取指针对应变量的值
    return 0;
}
复制代码

 

2、指针工作的原理

  在了解指针的工作原理之前,必须先了解C语言是如何在内存中存储数据的

  指针变量存储的值是其它变量的内存地址,也就是指针;指针变量类型必须和指针对应的变量的类型一致,虽然指针变量的类型不同,但是存储的指针的数据长度是一样的,可以把指针看作是一种数据类型

  指针实现了c语言的间接访问变量

 

  -与python不同的是,python中先创建值,在将值的内存地址赋值给变量

  第一步:现在内存中创建变量值10

  第二步:将值10的内存地址存放给变量A

  第三步:再在内存中创建11

  第四步:将值11的内存地址赋值给变量A(值10由于引用计数为0,会被python中垃圾回收线程回收,实际上因为小整数池的缘故这个例子只是例子)

a = 10
print(id(a))
a = 11
print(id(a))

# 结果发现两次a的存储得内存地址不同(id不是内存地址,它是区别内存地址的标识)

 

  -c语言中变量

复制代码
#include <stdio.h>

int main(){
    int a = 10;
    printf("a address is %p\n",&a);
    a = 11
    printf("a address is %p\n",&a);
    return 0;
}

// 两次地址是一致的
复制代码

 

复制代码
#include <stdio.h>

int main(){
    int a,b = 10;
    printf("a address is %p\n",&a);
    printf("b address is %p\n",&a);
    return 0;
}

// 不同变量存储了相同值,这在python中是不会出现的
复制代码

 

  is判断的其实是变量对应的值的内存地址是否一致,python中的变量的原理就类似于c语言中的指针

a = 10

b = 10

print(a is b)

 

3、注意的问题

  尝试直接用字符指针,存储字符串

#include <stdio.h>

int main(void){
    
    char *pa = "hello world";
    
    return 0;
}

    运行成功,但是有警告

  scanf与指针

复制代码
#include <stdio.h>

int main(void){
    
    char *pa = NULL;
    
    printf("please input a pharse:");
    scanf("%s", p);
    
    return 0;
}
复制代码

    这样是不可以运行的

 

  切记不要对未初始化指针的指针变量赋值

复制代码
#include <stdio.h>

int main(){
    int *pa;
    printf("pa address is %p\n",&pa);
    printf("pa value is %lld\n",*pa);
    // *pa = 222;
    return 0;
}
复制代码

  因为定义的指针变量有默认值,这个指针可能指向系统关键代码,直接复制,将会把关键代码替换掉

 

  指针必须是其它数据的内存地址(可以是变量,可以是字符串常量,可以是数组,可以是函数等等),拿到地址还不够,想要通过指针间接引用数据和功能,必须告诉指针它所指向的数据的格式,这样编译

  器在解引用时才知道如何使用得到的值(数组指针,数组函数。。。)

 

***完***

posted @   口乞厂几  阅读(99)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示