Menu Close

指针函数 – C语言

指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。

主要的区别是一个是指针变量,一个是函数。在使用是必要要搞清楚才能正确使用。

指针函数:带指针的函数,即本质是一个函数。 函数返回类型是某一类型的指针。

类型标识符 *函数名(参数表) int *f(x,y);

首先它是一个函数,只不过这个函数的返回值是一个地址值。指针函数一定有函数返回值,而且在主调函数中,函数返回值必须赋给同类型的指针变量。

当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。由于返回的是一个地址,所以类型说明符一般都是int。

int *f(int a, int b);

上面的函数声明又可以写成如下形式:

int* f(int a, int b);

让指针标志 * 与int紧贴在一起,而与函数名f间隔开,这样看起来就明了些了,f是函数名,返回值类型是一个int类型的指针。

例1.指针地址和指针所指内容

#include <stdio.h>

int *f(int a, int b);
int main(int argc, char* argv[])
{
   printf("------------------------------ Start\n");

   int *p1 = NULL;

   printf("The memeory address of p1 = 0x%x \n", p1);

   p1 = f(1, 2);

   printf("The memeory address of p1 = 0x%x \n", p1);
   printf("*p1 = %d \n", *p1);

   printf("------------------------------ End\n");
   getchar();
   return 0;
}

int *f(int a, int b)
{
   int *p = (int *)malloc(sizeof(int));
   printf("The memeory address of p = 0x%x \n", p);
   memset(p, 0, sizeof(int));
   *p = a + b;
   printf("*p = %d \n", *p);

  return p;
}

 

C语言malloc()函数:动态分配内存空间

头文件:#include <stdlib.h>

malloc() 函数用来动态地分配内存空间,其原型为:

void* malloc (size_t size);

【参数说明】size 为需要分配的内存空间的大小,以字节(Byte)计。

【函数说明】malloc() 在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。如果希望在分配内存的同时进行初始化,请使用 calloc() 函数。

【返回值】分配成功返回指向该内存的地址,失败则返回 NULL。

C语言memset() 函数 – 初始化内存

每种类型的变量都有各自的初始化方法,memset() 函数可以说是初始化内存的“万能函数”,通常为新申请的内存进行初始化工作。它是直接操作内存空间,mem即“内存”(memory)的意思。

该函数的原型为:

# include <string.h>
void *memset(void *s, int c, unsigned long n);

函数的功能是:将指针变量 s 所指向的前 n 字节的内存单元用一个“整数” c 替换,注意 c 是 int 型。s 是 void* 型的指针变量,所以它可以为任何类型的数据进行初始化。

memset() 的作用是在一段内存块中填充某个给定的值。因为它只能填充一个值,所以该函数的初始化为原始初始化,无法将变量初始化为程序中需要的数据。用memset初始化完后,后面程序中再向该内存空间中存放需要的数据。

memset 一般使用“0”初始化内存单元,而且通常是给数组或结构体进行初始化。一般的变量如 char、int、float、double 等类型的变量直接初始化即可,没有必要用 memset。如果用 memset 的话反而显得麻烦。

memset 函数的第三个参数 n 的值一般用 sizeof() 获取,这样比较专业。注意,如果是对指针变量所指向的内存单元进行清零初始化,那么一定要先对这个指针变量进行初始化,即一定要先让它指向某个有效的地址。而且用memset给指针变量如p所指向的内存单元进行初始化时,n 千万别写成 sizeof(p),这是新手经常会犯的错误。因为 p 是指针变量,不管 p 指向什么类型的变量,sizeof(p) 的值都是 4。

例2.本程序是通过指针函数,输入一个 1~7 之间的整数,输出对应的星期名

  main()
{
     int i;
     char *day_name(int n);
     printf("input Day No:\n");
     scanf("%d",&i);
     if(i<0) exit(1);
     printf("Day No:%2d-->%s\n",i,day_name(i));
}
char *day_name(int n)
{
     static char *name[]=
     {
       "Illegal day",
       "Monday",
       "Tuesday",
       "Wednesday",
       "Thursday",
       "Friday",
       "Saturday",
       "Sunday"
     };
     return((n<1||n>7) ? name[0] : name[n]);
}

本例中定义了一个指针型函数 day_name,它的返回值指向一个字符串。该函数中定义了一个静态指针数组 name。name 数组初始化赋值为八个字符串,分别表示各个星期名及出错提示。形参 n 表示与星期名所对应的整数。

在主函数中,把输入的整数 i 作为实参,在printf 语句中调用 day_name 函数并把 i 值传送给形参 n。day_name 函数中的 return 语句包含一个条件表达式,n 值若大于 7 或小于 1 则把 name[0]指针返回主函数输出出错提示字符串“Illegal day”。否则返回主函数输出对应的星期名。

主函数中的第 7 行是个条件语句,其语义是,如输入为负数(i<0)则中止程序运行退出程序。exit 是一个库函数,exit(1)表示发生错误后退出程序,exit(0)表示正常退出。

应该特别注意的是函数指针变量和指针型函数这两者在写法和意义上的区别。int(*p)()和 int *p()是两个完全不同的量。

int (*p)()是一个变量说明,说明 p 是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少。

int *p()则不是变量说明而是函数说明,说明 p 是一个指针型函数,其返回值是一个指向整型量的指针,*p 两边没有括号。作为函数说明,在括号内最好写入形式参数,这样便于与变量说明区别。
对于指针型函数定义,int *p()只是函数头部分,一般还应该有函数体部分。

wer

除教程外,本网站大部分文章来自互联网,如果有内容冒犯到你,请联系我们删除!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Leave the field below empty!

Posted in C语言教程

Related Posts