• C语言杂谈——指针篇


    指针是C语言的难点,其原因是它拥有多重的含义。这给已熟练理解C语言指针精髓的程序员带来的好处是,可以天马行空的构建软件。但很不幸,我不是那些能够熟练理解并天马行空利用C指针的一员。对于我来说,是不是指针只有置之高阁了呢?答案是否定的,我们前面说过“C指针成为难点的原因是因为它拥有多重含义”。这让我想到了Doug McIlroy的一句话:“Write programs that do one thing and do it well. ”。如果你了解UNIX,那么这句话你一定不会陌生。这就是Doug McIlroy告诉我们UNIX哲学中的第一条。为什么在这里提到这句话呢?“写程序,做一件事并做好它。”这同样适用于C指针。下面我把为自己定制的规矩罗列如下:

    1)数据类型*同时出现,作为针数据类型指针数据类型用来申明地址变量.

    2)*单独出现,用作指向符,表示一种运算。


    (一)指针和简单数据类型

    int var;	
    int *pvar;	//声明一个地址变量pvar
    pvar = &var;	//地址变量当然存储地址了

    (当然,像很多书中说的int *pvar;有三层含义还是要知道的,这里只是为了清晰思路强调重点,在第一感官上产生这种认识。停下后,会想到该指针指向的内容是int型等等。)

    这样再去理解下面传递指针参数的示例是不是通透了?

    示例1:

    int myadd(int *num1,int *num2)
    {
    	int sum;
    	sum = *num1 +*num2;
    	return sum;
    }
    
    main()
    {
    	int x,y,z;
    	x = 10;
    	y = 5;
    	z = myadd(&x,&y);	//是不是理解实参为什么是地址了?
    	printf("%d+%d = %d\n",x,y,z);
    }

    (二)指针与数组

    1)一维数组:

    p[i] ≡ *(p+i);

    2)二维数组:

    p[i][j] ≡ *(p[i]+j) ≡ *(*(p+i)+j);

    (三)指针和结构体

    struct add
    {
    	int num1;
    	int num2;
    	int sum;
    };
    
    struct add var;
    struct add *pvar;   pvar = &var;
    
    var.num1 = 10;
    var.num2 = 5;
    var.sum = var.num1 + var.num2;
    

    则:

    image

    即:pvar->num1 ≡ var.num1

           pvar->num2 ≡ var.num2

           pvar->sum ≡ var.sum

    (四)指针与函数

    int add(int x,int y)
    {
    	int sum = x + y;
    	return sum;
    }
    
    int main()
    {
    	int num1,num2,sum1,sum2;
    	int (*myadd)(int,int);
    	myadd = add;
    	
    	sum1 = myadd(num1,num2);
    	sum2 = (*myadd)(num1,num2);
    	printf("%d,%d",sum1,sum2);
    	
    	return 0;
    }

    这里myadd就是指向add()函数的指针了。指令myadd(num1,num2)调用add()函数,并把参数num1、num2传递给它。

    myadd(num1,num2)和(*myadd)(num1,num2)的意义是一样的,但为了和自己定的规则一致提倡用myadd(num1,num2)。


    彩虹以上内容仅代表个人观点,请甄别选择。敬请对指针有深入了解的朋友留言指点。



  • 相关阅读:
    Web前端浏览器兼容性问题及解决方案
    JS
    vue element-ui 重置样式问题
    学习的一些文章链接
    打开新世界的第一步:学习servlet
    java学习初体验之课后习题
    下载、安装jdk8(Windows下)并配置变量环境
    下载PhpStorm并进行激活
    WCF+NHibernate 序列化
    wcf 证书+ssl+自定义用户名密码
  • 原文地址:https://www.cnblogs.com/hanzhaoxin/p/2779854.html
Copyright © 2020-2023  润新知