[Pointer]C语言中指针的高级用法

原创 2015年07月11日 00:18:28
   问题描述:指针是C语言很有特色的一个部分,但是使用也比较复杂,很容易导致一些莫名的错误,比如有时候函数指针没有赋值,有时指向了未定义的内存,这些时候都可能导致程序异常执行或者崩溃。但指针的灵活性让它可以实现很多复杂的操作,如指向指针的指针,指向函数的指针。
   指向指针的指针:函数传递参数是传值调用的,如果想在调用函数时改变传入的参数的值,而且该传入的参数的值本来是个指针时,这时就可以使用指向指针的指针了,以这种方式一般不用给函数返回参数,函数中只拷贝指向指针的指针值,而被指向的指针以及该指针指向的内存单元都可以直接操作,
void add_to_list(struct node **list, int n) {
    struct node*new_node;
    new_node =malloc(sizeof(struct node));
    if(new_node == NULL) { // 确认申请内存成功
       printf("Error: malloc failed inadd_to_list\n");
       exit(EXIT_FAILURE);
    }
    new_node->value =n;
    new_node->next =*list;
    *list = new_node;
}
add_to_list(&first, 10);
   该函数用于将结点添加到一个链表的表头,first本身是一个指针,其指向链表的表头结点,&first将其指针的地址传入函数赋值给指向指针的指针**list,此时list为指向first指针的指针,*list即为first,因此在函数内部对*list进行操作即相当于对外部的first指针进行操作一样,图示如下:


   指向函数的指针:指针不只能指向数据,也能指向函数。函数占用内存单元,每个函数都有地址的,因此可以使用指向函数的指针。指向函数的指针在调用函数较多的地方会用到,另外也可以设计架构利用函数指针模拟某一对象的行为。
double integrate(double (*f)(double), double a, double b); //声明一,表明第一个参数接收函数指针
double integrate(double f(double), double a, double b); //声明二,不建议使用,表意不明确
result = integrate(sin, 0.0, PI/2); // 调用
   在integrate函数体内(*f)(x)即表示sin(x)的调用。
   由于C语言将函数指针当成数据指针对待,可以将函数指针存储在变量之中,也可以当作数组的元素,这样,在索引数组元素时就可以得到事先存储好的函数调用了。函数指针也可用作结构或联合的成员,可以作为函数的返回值等。
   传递给函数指针的值是某个函数的函数名,后面不用括号,这个与数组类似,数组名代表地址,函数名也是代表地址。
void (*pf)(int);  // 函数指针变量声明
pf = f;  // 函数指针变量赋值
(*pf)(i);  //f(i),函数指针指向的函数的调用,也可以直接用pf(i)
   函数指针数组:
void (*file_cmd[])(void) = {new_cmd, open_cmd; close_cmd,close_all_cmd, save_cmd, save_as_cmd, save_all_cmd, print_cmd,exit_cmd};  //函数指针数组初始化赋值,函数指针数组在函数指针变量后多了[]
(*file_cmd[n])();  //函数指针数组元素的调用,调用对应的函数,也可以用file_cmd[n]();
   受限指针(C99):
int * restrict p;  //p为受限指针,restrict为关键字
   受限指针p指向的对象在之后需要修改,那么该对象不会允许通过除p之外的任何方式访问。一个例子就是中的memcpy和memmove两个函数的区别,其原型分别为:
void *memcpy(void * restrict s1, const void * restrict s2,size_t n); // 表明s1和s2不应当重叠
void *memmove(void * s1, const void * s2, size_t n);
   灵活数组成员(C99):这个功能用于字符串数组作为结构的成员时动态分配内存,
struct vstring {
    ing len;
    char chars[];
};  //包含字符串数组的结构,该结构最后一个成员为数组时,长度可省略--就是灵活数组成员
struct vstring *str = malloc(sizeof(struct vstring) +n);
str->len = n;
版权声明:本文为博主原创文章,未经博主允许不得转载。

C语言指针(Pointer)课件``````

  • 2011年01月16日 21:34
  • 251KB
  • 下载

C语言学习笔记(十) -指针下 Pointer

使用指针实现数据交换//使用指针实现数据交换#include void swap(int *,int *);int main(void) { int a,b; printf("请输...

C语言指针用法详解

  • 2012年11月13日 22:05
  • 204KB
  • 下载

C语言指针用法总结+ 解析

  • 2012年03月03日 17:14
  • 738KB
  • 下载

C语言宏高级用法总结

1、前言     今天看代码时候,遇到一些宏,之前没有见过,感觉挺新鲜。如是上网google一下,顺便总结一下,方便以后学习和运用。C语言程序中广泛的使用宏定义,采用关键字define进行定义,...

C语言指针用法难点

  • 2013年07月15日 15:04
  • 16KB
  • 下载

C语言宏高级用法 [总结]

转自:http://www.cnblogs.com/Anker/p/3418792.html 1、前言     今天看代码时候,遇到一些宏,之前没有见过,感觉挺新鲜。如是上网google一...

c语言高级指针理解及应用(上)

大纲 1.指针的基础知识; 2.指针和指针类型; 3.二级指针; 4.指针表达式解析 5.指针运算; 6.指针的应用的一些代码**本文先说明一些指针的概念及一些简单应用,更详细的将在(下)...

gdb调试&C语言指针高级编程(5.7)

GCC编译器简介: 一、基本知识了解      GCC是由gun之父Stallman所开发的linux下的编译器。全程为GNU C Complier (GNU c语言编译器)。这是一种早期的说法,早期...

iOS开发之c语言基础-高级指针

// //  main.m //  c9- 高级指针 // //  Created by dllo on 15/10/16. //  Copyright (c) 2015...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Pointer]C语言中指针的高级用法
举报原因:
原因补充:

(最多只允许输入30个字)