指针,c语言的灵魂

简介:

指针是一个值为内存地址的变量。

422101-20171201234925995-380852705.png

变量是一块内存空间,指针是变量,是用来存储内存地址的变量。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int num = 9;
    printf("num变量的地址为:%p\n",&num); // p表示指针占位符
    return 0;
}

422101-20171202001653933-779517732.png

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int num = 9;
    int * ptr_num = &num;
    printf("num变量的地址为:%p\n",ptr_num); // p表示指针占位符
    return 0;
}

422101-20171202002223120-68238159.png

根据地址,找到空间!然后操作空间!

变量地址也占用空间,只不过占用的不是内存空间,而是寄存器的存储空间。

内存地址实际上是一种偏移量,存储于段寄存器中。内存地址只是一种抽象,不是真正的物理内存地址,而是逻辑地址。由逻辑地址寻找到物理地址需要经过 逻辑地址->线性地址->物理地址 转换过程,而这些过程都是基于寄存器完成的。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int num = 9;
    int * ptr_num = &num;
    * ptr_num = 10;
    printf("* ptr_num的值为:%d\n",* ptr_num);
    printf("num的值为:%d\n",num); // p表示指针占位符
    return 0;
}

指针的类型,跟他所指向的数据结构有关。
基本类型的指针指向基本类型的数据结构。
比如:char * p; int p; float p; double *p;
分别指向的是char, int ,float, double 类型的变量。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int num1 = 1024;
    int num2 = 2048;
    int * ptr1;
    int * ptr2;
    ptr1 = &num1;
    ptr2 = &num2;
    printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1);
    printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2);

    // 将变量1的值赋给变量2
    num2 = num1;
    printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1);
    printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2);

    *ptr2 = *ptr1; // 等价于 num2 = num1
    printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1);
    printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2);

    // 地址变了,num1,num2不受影响
    ptr2 = ptr1;
    printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1);
    printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2);


    return 0;
}

一个变量就是一个内存空间,内存一定是有物理地址的!指针就是保存变量内存物理地址的变量!

指针与数组

数组是一个连续的内存空间,数组名就是它的首地址。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    double score[] = {98,87,65,43,76};
    printf("数组的首地址:%p\t 数组手元素的地址 :%p\n",score,&score[0]);

}

数组名就是数组元素的首地址。

422101-20171210000617685-1549460925.png

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i;
    double score[5] = {98,87,65,43,76};
    double * ptr_score;
    ptr_score = score;
    for (i=0;i<5;i++) {
        printf("%.2lf\n",*ptr_score++); // 通过首地址取找数组元素的值
    }

    for (i=0;i<5;i++) {
        printf("%.2lf\n",score[i]);
    }

}

等价的!double类型的数据,每个数据移动了8个字节。物理地址是一个十六进制的数字。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int array[] = {15,20,25,30,35};
    int i;
    int * ptr_array = array;
    for (i = 0;i<5;i++) {
        printf("第%d个元素的值为%d,地址为%p\n",i,*ptr_array,ptr_array);
        ptr_array ++ ;
    }

    /*
    第0个元素的值为15,地址为0028FF0C
    第1个元素的值为20,地址为0028FF10
    第2个元素的值为25,地址为0028FF14
    第3个元素的值为30,地址为0028FF18
    第4个元素的值为35,地址为0028FF1C
    */
    return 0;
}

int型地址间隔4个字节。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 7

int main()
{
    int array[N] = {15,20,25,30,35,40,90};
    int i;
    int temp;
    // 实现数组的逆序
    // 数组的首尾元素进行交换
    for (i = 0;i<floor(N/2);i++) {
        temp = array[i];
        array[i] = array[N-i-1];
        array[N-i-1] = temp;
    }

    for (i = 0;i<N;i++) {
        printf("交换后第%d元素的值为:%d\n",i,*(array + i));
    }
    return 0;
}

逆序数组,找规律是写程序必备的技能!

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 7

int main()
{
    int array[N] = {15,20,25,30,35,40,90};
    int i;
    int temp;

    int * ptr_head;
    int * ptr_foot;
    ptr_head = &array[0];
    ptr_foot = &array[N-1];

    // 实现数组的逆序
    // 数组的首尾元素进行交换
    for (i = 0;i<floor(N/2);i++) {
        temp = * ptr_head;
        * ptr_head = * ptr_foot;
        * ptr_foot = temp;
        ptr_head ++;
        ptr_foot --;
    }

    for (i = 0;i<N;i++) {
        printf("交换后第%d元素的值为:%d\n",i,*(array + i));
    }
    return 0;
}

指针实现数组逆序!

二维数组与指针

首地址

&a[0][0]

有祥有略!有精有简!有的放矢有的取舍去学习!

何为二维数组,如何理解?由n个一维数组组成!

#include <stdio.h>
#include <stdlib.h>
#include <math.h>


int main()
{
    int i,j;
    double score[5][3] = {
        {55,56,57},
        {58,59,60},
        {61,62,63},
        {64,65,66},
        {67,68,69}
    };

    // 传统的访问方式
    for (i = 0;i < 5;i++) {
        for (j = 0;j <3 ;j++) {
            printf("%.2lf\t",score[i][j]);
        }

        printf("\n");
    }

    printf("=================================\n");

    // 指针的方式访问
    for (i = 0;i < 5;i++) {
        for (j = 0;j <3 ;j++) {
            // printf("%.2lf\t",*(score[i] + j));
            printf("%.2lf\t",*(*(score+i) + j));
        }

        printf("\n");
    }


    return 0;
}

*(*(score + i) + j) 获取二维数组的公式!



本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/8025510.html,如需转载请自行联系原作者

相关文章
|
16天前
|
存储 C语言
C语言 — 指针进阶篇(下)
C语言 — 指针进阶篇(下)
20 0
|
16天前
|
存储 C语言 C++
C语言 — 指针进阶篇(上)
C语言 — 指针进阶篇(上)
26 0
|
23天前
|
存储 程序员 C语言
C语言指针的概念、语法和实现
在C语言中,指针是其最重要的概念之一。 本文将介绍C语言指针的概念、语法和实现,以及如何使用它们来编写高效的代码。
14 0
|
23天前
|
存储 C语言
【C语言】深入解开指针(三)2
【C语言】深入解开指针(三)
|
23天前
|
存储 程序员 C语言
【C语言】深入解开指针(二)2
【C语言】深入解开指针(二)
【C语言】深入解开指针(二)2
|
23天前
|
存储 C语言
【C语言】深入解开指针(一)1
【C语言】深入解开指针(一)
|
24天前
|
C语言 索引
基于C语言的函数指针应用-消息命令处理框架
基于C语言的函数指针应用-消息命令处理框架
11 0
|
1月前
|
存储 人工智能 编译器
C语言指针详解
指针运算,指针和数组,二级指针
C语言指针详解
|
1月前
|
存储 C语言
C语言第二十四弹---指针(八)
C语言第二十四弹---指针(八)
|
1月前
|
编译器 C语言
C语言第十九弹---指针(三)
C语言第十九弹---指针(三)