26_指针的本质分析

关键词:* 号的意义传值调用和传址调用常量与指针

程序中的变量是一段存储空间的别名,本质上是一段存储空间。

问题:程序中的变量只是一段存储空间的别名,那么是不是必须通过这个别名才能使用这段存储空间?

问题:是不是只能通过变量使用存储空间?

#include<stdio.h>

int main()
{
    int i = 5;
    int* p = &i;
    printf("i = %d, p = %p\n", i, p);
   
    *p = 10;
    printf("change_i = %d, p = %p\n", i, p);

    return 0;
}

总结: 可以通过指针来使用存储空间。

1. * 号的意义

在指针声明时, * 号表示所声明的变量为指针;
在指针使用时,* 号表示取指针所指向的内存空间中的值。


指针的声明和使用

指针的特殊点:

  1. 指针的本质是变量,但变量的值是一个内存地址;

  2. *号在指针中类似一把钥匙,通过这把钥匙可以打开内存,读取内存中的值。

小贴士:


小贴士
#include<stdio.h>

int main()
{   
    int i = 5;
    int* pI = NULL;
    char* pC = NULL;
    float* pF = NULL;

    pI = &i;
    *pI = 10;

    printf("&i = %p, pI = %p, i = %d\n", &i, pI, i);
    printf("sizeof(int) = %d, sizeof(int*) = %d, &pI = %p\n", sizeof(pI), sizeof(int*), &pI);
    printf("sizeof(char) = %d, sizeof(char*) = %d, &pC = %p\n", sizeof(pC), sizeof(char*), &pC);
    printf("sizeof(float) = %d, sizeof(float*) = %d, &pF = %p\n", sizeof(pF), sizeof(float*), &pF);

    return 0;
}

输出结果:

&i = 0xbff7d6c0, pI = 0xbff7d6c0, i = 10
sizeof(int) = 4, sizeof(int*) = 4, &pI = 0xbff7d6c4
sizeof(char) = 4, sizeof(char*) = 4, &pC = 0xbff7d6c8
sizeof(float) = 4, sizeof(float*) = 4, &pF = 0xbff7d6cc

在同一编译器下,指向不同类型的指针占用内存的大小一样的原因:指针为变量,保存地址值,对于一台计算机,它的内存地址占用的空间跟地址总线有关,我们常说的32位系统,64位系统指的是内存地址的寻址范围,当使用32位系统的编译器,它的寻址范围也就是32位,即4个字节;换句话说所有的32系统上的指针变量都可以用4个字节存储任意类型的地址值。

2. 传值调用和传址调用

  1. 指针是变量,因此可以声明指针参数
  2. 当一个函数体内部需要改变实参的值,则需要使用指针参数
  3. 函数调用时实参值将复制到形参
  4. 指针适用于复杂数据类型作为参数的函数中,如果通过一个很大的结构体来调用一个函数,往往将这个函数的参数声明为指针参数。

例子;当一个函数体内部需要改变实参的值,则需要使用指针参数——两个值的交换

#include<stdio.h>

void exchange1(int* a, int* b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;

}

int main()
{
    int m = 1;
    int n = 2;

    printf("m = %d, n = %d\n", m, n);
    
    exchange1(&m, &n);

    
    printf("m = %d, n = %d\n", m, n);

    return 0;
}

输出结果:

m = 1, n = 2
m = 2, n = 1

总结:通过传址调用来交换两个值

3. 常量与指针

指针的本质就是变量,而关键字const可以修饰一个变量 ==> 可以用const来修改指针。

const int* p;       // p的值是变量,p指向的内容不可变,即p可以重新赋地址值,但*p不能重新赋值;

int const* p;       //p的值是变量,p指向的内容不可变,即p可以重新赋地址值,但*p不能重新赋值;

int* const p;       // p的值不可变,p指向的内容可变,即p不可以重新赋地址值, *p可以重新赋值

const int* const p; // p和p指向的内容都不可变,即p不可以重新赋地址值, *p不可以重新赋值  

口诀: 左数右指
当const出现在* 号左边时指针指向的数据为常量;
当const出现在* 号右边时指针本身为常量。

#include<stdio.h>

int main()
{
    int j = 10;
    int i = 5;
    int m = 1;
    int n = 2;
    
    const int* pI = &i;
    pI = &j;        // right:assignment of read-only location ‘*pI’
//    *pI = 0;      // Error

    int const* pJ = &j;
    pJ = &i;        // right
//    *pJ = 0;      // Error: assignment of read-only location ‘*pJ’

    int* const pM = &m;
//    pM = &n;          // Error:assignment of read-only variable ‘pM’
    *pM = 100;

    const int* const pN = &n;
//    pN = &m;      // Error:assignment of read-only variable 'pN'
//    *pN = 10;     // Error: assignment of read-only location '*pN'

    return 0;

}

4.小结

  1. 指针是C语言中一种特别的变量
  2. 指针所保存的值是内存的地址
  3. 可以通过指针修改内存中的任意地址内容

声明:此文章为本人在学习狄泰软件学院《C语言深度解析》所做的笔记,文章中包含狄泰软件资料内容一切版权归狄泰软件所有!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容