C指针笔记-创新互联

重新学习C语言,整理一篇关于C语言指针的文章是很有必要的。

成都创新互联-专业网站定制、快速模板网站建设、高性价比高明网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式高明网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖高明地区。费用合理售后完善,十年实体公司更值得信赖。

首先是指针的理解:指针是一个变量,存放内存地址的一个变量。

先由一段代码引出:

#include 
#include 
int main()
{
    int year = 2017;
    int * prt_year = NULL;
    prt_year = &year;
    printf("今年是%d年",*prt_year);
    return 0;
}

指针的定义需要借助特殊的符号    *    :上面代码“int * prt_year = NULL;”可以这样理解“定义一个类型为int的指针prt_year变量”;

指针的内容的赋值,需要借助特殊的符号    &    :上面代码“prt_year = &year;”可以这样理解 “将指针prt_year指向year或者将year赋值给prt_year这个地址”;

借助下面的图,你可以理解的更加的清楚:

C指针笔记

题外话题:地址一般使用16进制的数字表示,可以打印出来:printf("prt_year的地址:%p" , prt_year);,注意每个人打印的地址可能都是不一样的,不要纠结,这个是电脑自动分配的。

引出下一段代码:

#include 
#include 
int main()
{
    int year = 2017;
    int per_year = 2016;
    int * prt_year = NULL;
    int * prt_per_year = NULL;
    prt_year = &year;
    prt_per_year = &per_year;
    printf("今年是%d年\n",year);
    printf("去年是%d年\n",per_year);
    printf("--------------------------------------------\n");
    //重点
    prt_per_year = prt_year;
    *prt_per_year = 2018;
    printf("今年是%d年\n",year);
    printf("去年是%d年\n",per_year);
    return 0;
}

先看结果如下图:

C指针笔记

出现了怪异的结果。显然,指针“prt_per_year”已经不指向"per_year"了,而是指向了"year"。这是因为“prt_per_year = prt_year;”可以理解为 prt_year的地址赋值给prt_per_year,它们两个都指向了year。

有多个指针都是指向同一个地址,这在真正的编程中是不允许的,都是后出Bug都不知道是哪个指针挖的坑。

因为指针和数组结合的比较紧密,So , 先给出一下概念:

①,数组是一组连续的内存空间

②,数组名称就是这个内存空间的首地址

测试效果如下图:

C指针笔记

那么,上一段代码先:

#include 
#include 
int main()
{
    system("color 1A");
    int score[] = {98,77, 65 , 32 , 85};
    int * prt_score = NULL;
    prt_score = score;//指向数组的首地址
    //prt_score = &score[0];//指向数组的首地址
    //遍历
    for(int i = 0 ; i < 5 ; i ++)
    {
        //printf("第%d个元素的值为%d \n" , i+1 , score[i]);
        printf("第%d个元素的值为%d \n" , i+1 , *(prt_score+i));
        //printf("第%d个元素的值为%d \n" , i+1 , *p++);//=(*p)++
    }
    return 0;
}

解释 :    prt_score = score;          prt_score = &score[0];       这2句的效果是一样的,都是指向数组的首地址。

                printf("第%d个元素的值为%d \n" , i+1 , score[i]);              printf("第%d个元素的值为%d \n" , i+1 , *(prt_score+i));      printf("第%d个元素的值为%d \n" , i+1 , *p++);//=(*p)++   这3句的执行效果是一样的

结果预览一下 :

C指针笔记

ok , 接下来深入二维数组 , 很有意思

#include 
#include 
int main()
{
    system("color 1A");
    int score[2][3] = {1,2,3,4,5,6};
    for( int i = 0 ; i < 2 ; i++)
    {
        for(int j = 0 ; j < 3 ; j++)
        {
            //printf("第%d行 第%d列的值为 : %d\n" , i + 1 , j + 1 , score[i][j]);
            //printf("第%d行 第%d列的值为 : %d\n" , i + 1 , j + 1 , *(score[i] + j));
            printf("第%d行 第%d列的值为 : %d\n" , i + 1 , j + 1 , *(*(score + i) + j));
        }
    }
    return 0;
}

先看下执行的结果:

C指针笔记

解释 :

           //printf("第%d行 第%d列的值为 : %d\n" , i + 1 , j + 1 , score[i][j]);
           //printf("第%d行 第%d列的值为 : %d\n" , i + 1 , j + 1 , *(score[i] + j));
           printf("第%d行 第%d列的值为 : %d\n" , i + 1 , j + 1 , *(*(score + i) + j));

这3句的执行效果是一样的,我只说一句 :数组名称就是这个内存空间的首地址

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站名称:C指针笔记-创新互联
当前网址:http://scyanting.com/article/pscgc.html