C语言杂谈——指针篇

简介:

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

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

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


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

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

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

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

示例1:

  1. int myadd(int *num1,int *num2)  
  2. {  
  3.     int sum;  
  4.     sum = *num1 +*num2;  
  5.     return sum;  
  6. }  
  7.   
  8. main()  
  9. {  
  10.     int x,y,z;  
  11.     x = 10;  
  12.     y = 5;  
  13.     z = myadd(&x,&y);   //是不是理解实参为什么是地址了?  
  14.     printf("%d+%d = %d\n",x,y,z);  
  15. }  

(二)指针与数组

1)一维数组:

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

2)二维数组:

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

(三)指针和结构体

  1. struct add  
  2. {  
  3.     int num1;  
  4.     int num2;  
  5.     int sum;  
  6. };  
  7.   
  8. struct add var;  
  9. struct add *pvar;   pvar = &var;  
  10.   
  11. var.num1 = 10;  
  12. var.num2 = 5;  
  13. var.sum = var.num1 + var.num2;  

则:

image

即:pvar->num1 ≡ var.num1

       pvar->num2 ≡ var.num2

       pvar->sum ≡ var.sum

 

(四)指针与函数

  1. int add(int x,int y)  
  2. {  
  3.     int sum = x + y;  
  4.     return sum;  
  5. }  
  6.   
  7. int main()  
  8. {  
  9.     int num1,num2,sum1,sum2;  
  10.     int (*myadd)(int,int);  
  11.     myadd = add;  
  12.       
  13.     sum1 = myadd(num1,num2);  
  14.     sum2 = (*myadd)(num1,num2);  
  15.     printf("%d,%d",sum1,sum2);  
  16.       
  17.     return 0;  
  18. }  

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

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


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



作者: 韩兆新
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
分类:  [03]C语言杂谈
标签:  C语言杂谈

本文转自韩兆新博客博客园博客,原文链接:http://www.cnblogs.com/hanzhaoxin/archive/2012/11/20/2779854.html,如需转载请自行联系原作者
目录
相关文章
|
11月前
|
C语言
【c语言】指针就该这么学(1)
本文详细介绍了C语言中的指针概念及其基本操作。首先通过生活中的例子解释了指针的概念,即内存地址。接着,文章逐步讲解了指针变量的定义、取地址操作符`&`、解引用操作符`*`、指针变量的大小以及不同类型的指针变量的意义。此外,还介绍了`const`修饰符在指针中的应用,指针的运算(包括指针加减整数、指针相减和指针的大小比较),以及野指针的概念和如何规避野指针。最后,通过具体的代码示例帮助读者更好地理解和掌握指针的使用方法。
186 1
|
7月前
|
存储 人工智能 Java
一文轻松拿捏C语言的指针的基础使用
本文介绍了C语言中的指针概念,包括直接访问和间接访问内存的方式、指针变量的定义与使用、取址运算符`&`和取值运算符`*`的应用,帮助读者深入理解指针这一C语言的核心概念。君志所向,一往无前!
136 0
|
9月前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
299 7
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
9月前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
1072 9
|
9月前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
264 7
|
10月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
832 13
|
10月前
|
存储 C语言 开发者
C 语言指针与内存管理
C语言中的指针与内存管理是编程的核心概念。指针用于存储变量的内存地址,实现数据的间接访问和操作;内存管理涉及动态分配(如malloc、free函数)和释放内存,确保程序高效运行并避免内存泄漏。掌握这两者对于编写高质量的C语言程序至关重要。
303 11
|
10月前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
10月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
10月前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
591 3