指针与内存

一.首先在谈指针之前,需要先说一下内存,程序在运行时内存分为如下几块:

  1. 栈:分配局部变量空间,存储临时变量,由操作系统分配回收。

  2. 堆:由程序员手动通过malloc/new分配,操作系统可能不会回收需要手动释放,否则会造成内存泄漏,malloc/free与new/delete要成对出现。

  3. 常量区:存放常量,比如字符串常量。

  4. 全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,该区域在程序结束后由操作系统释放。

  5. 代码区:由操作系统分配,对程序员来说是透明的,无法访问。

#include<stdio.h>
int a = 0;//全局区
int main()
{
    int b; //栈 
    char s[] = "abc"; //栈 
    char *p2; //栈 
    char *p3 = "123456"; //123456在常量区,p3在栈上。
    p2 = (char *)malloc(20);  //堆 
    static int c =0//全局(静态)区
    return 0;
}

二.关于指针我们需要知道:
1. 指针变量也是一种变量,占有内存空间,用来保存内存地址
2. 指针与内存紧密相连,没有内存指针没有意义
3. 对指针的操作实际上是对内存间接操作
4. 指针变量和它指向的内存块是两个不同的概念
5. 指针是一种数据类型,取决于它所指向的内存空间的数据类型

#include<stdio.h>

int main()
{
    int a=10;
    int *p;
    p=&a;
    printf("a:%d\n",a);
    printf("&a:%x\n",&a);
    printf("p:%x\n",p);
    printf("*p:%d\n",*p);

    return 0;
}
运行结果如图:

运行结果

代码内存如图:
这里写图片描述

由图我们可以看出p中存放的是a的地址,而并不是a的值,那么对*p的操作就是对a的操作

对于指针

  • 在指针声明时,*号表示所声明的变量为指针
  • 在指针使用时,*号表示 操作 指针所指向的内存空间中的值
  • *p相当于通过地址(p变量的值)找到一块内存;然后操作内存
  • *p放在等号的左边赋值(给内存赋值)
  • *p放在等号的右边取值(从内存获取值)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值