指针数组,数组指针,函数指针,main函数实质,二重指针,函数指针作为参数,泛型函数

简介:  1、指针数组    数组里面的每个元素都是指针。    指针数组的案例如下:    易犯错误: 2、数组指针   归根结底还是指针,只是取*的时候能够取出一整个数组出来。 数组指针:(一个指针指向了数组,一般和二维数组搭配使用)。 下面的(p+1)表示的是加过20个字符。   3、函数指针: 在gcc编译


1、指针数组

   数组里面的每个元素都是指针。

   指针数组的案例如下:

   易犯错误:

2、数组指针

  归根结底还是指针,只是取*的时候能够取出一整个数组出来。

数组指针:(一个指针指向了数组,一般和二维数组搭配使用)。

下面的(p+1)表示的是加过20个字符。

 

3、函数指针:

gcc编译的时候增加一些调试信息的方式是:

gcc demo.c –g –o app   -g表示增加一些调试信息

objdump –dSsx app > file   app反汇编,然后重定向到file文件中。函数指针定义:

 

4、指针作为参数

 

sizeof(p)

sizeof(*p)

p+1

char *  p[10]

40

4

加过4Byte

char **p

4

4   注意sizeof**P= 1

加过4个字节

char (*p)(void) 函数指针

4

无大小

无意义

char (*p)[20]  数组指针

 

 

20

 

5main函数实质介绍:

 

6、二重指针:

指针数组和二重指针实际上是等价的。

 

7、数组指针等价于二维数组:

                                                                                                                                                 

8、函数指针作为函数的参数

 

9、泛型函数:

#include <stdio.h>

#include <time.h>

#include <stdlib.h>

 

void show_arry(int a[], int n)

{

         inti;

         for(i = 0; i < n; i++)

                   printf("%d\n",a[i]);

         putchar('\n');

}

void init_arry(int a[], int n)

{

         inti;

         srand(time(NULL));

         for(i = 0; i < n; i++)

                   a[i]= rand() % 100;

}

int cmp_int(void *a, void *b)

{

         intx = *((int *)a);

         inty = *((int *)b);

         returnx > y;

}

void swap_int(void *a, void *b)

{

         inttmp;

         tmp= *((int *)a);

         *((int*)a) = *((int *)b);

         *((int*)b) = tmp;

}

//泛型模板是通过void *的方式得到的。

void bubble_sort(void *a, int n,int(*cmp)(void *, void *), void (*swap)(void *, void *))

{

         inti, j;

         for(i = 0; i < n; i++)

                   for(j = 0; j < n-i-1; j++)

                            if(cmp((void *)((int *)a+j), (void *)((int *)a+j+1)) > 0)

                //注意这里的(int*)只是告诉编译器传递的是4个字节的长度,对于float的也是四字节的。

                                     swap((void*)((int *)a+j), (void*)((int*)a+j+1));

}

/*

int main(void)

{

         inta[10];

         init_arry(a,10);

         show_arry(a,10);

         bubble_sort(a,10, cmp_int, swap_int);

         show_arry(a,10);

}

*/

int cmp_float(void *a, void * b)

{

         return*((float *)a) > *((float *)b);

}

void swap_float(void *a, void *b)

{

         floattmp;

         tmp= *((float *)a);

         *((float*)a) = *((float *)b);

         *((float*)b) = tmp;

 

}

void show_float(float a[], int n)

{

         inti;

         for(i = 0; i < n; i++)

                   printf("%f\n",a[i]);

         putchar('\n');

}

int main(void)

{

         floata[5] = {1.3, 4.5, 2.3, 1.2, 3.7};

         bubble_sort(a,5, cmp_float, swap_float);

         show_float(a,5);

}

目录
相关文章
|
2月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
2月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
2月前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
2月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
186 13
|
7月前
|
C语言
指针进阶(C语言终)
指针进阶(C语言终)
|
3月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
45 0
|
4月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
168 4
|
5月前
|
C语言
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
|
5月前
|
C语言
【C初阶——指针4】鹏哥C语言系列文章,基本语法知识全面讲解——指针(4)
【C初阶——指针4】鹏哥C语言系列文章,基本语法知识全面讲解——指针(4)
|
5月前
|
存储 编译器 C语言
【C初阶——指针3】鹏哥C语言系列文章,基本语法知识全面讲解——指针(3)
【C初阶——指针3】鹏哥C语言系列文章,基本语法知识全面讲解——指针(3)