1.数组指针与指针数组?
(1)指针数组:是数组,用来存放指针的。
Eg:Int * arr[10];
(2)数组指针:是指针(存放数组的地址),指针指向数组。
Eg:Int* (*p)[10];
(3)函数指针:是指针(存放函数的地址),指针指向函数。
Eg:int (*p)(int,int)
(4)函数指针数组:是数组,数组用来存放函数指针(即函数的地址)。
Eg:int (*p[10])(int,int)
(5)指向函数指针数组的指针:是指针,指针指向数组,数组的每个元素是函数指针。
Eg:int(*(*p)[10])(int,int);
2. 辨别下列的代码?
(1)int arr[5];
整型数组 该数组有5个元素,每个元素是int型 ;
(2)int *parr1[10];
指针数组 该数组有10个元素,每个元素是int * ;
(3)int (*parr2)[10];
数组指针 该指针指向数组,数组有10个元素,每个元素是int型
(4)int (*parr3[10])[5];
指针数组,数组有10个元素,每个元素是数组指针;该指针指向数组,数组有5个元素,每个元素是int型。
(5)(*(void (*)())0)();
(void (*)())0 先把0强制类型转换为函数指针(指针指向的函数返回值为void,函数无参数),再对强制类型转换的结果解引用,最后进行函数调用。
(6)void (*signal(int , void(*)(int)))(int);
signal(int , void(*)(int))这是一个函数,函数的第一个参数是int,第二个参数是void(*)(int)函数指针。signal函数的返回值是void(*)(int)
这是一个返回类型是函数指针的函数声明,该函数的参数是一个int类型和一个函数指针。
3.add和&add,arr和&arr的区别?
(1)add和&add的结果一摸一样,两者无区别,两者可随便写。
(2)arr和&arr
arr:是首元素的地址
&arr:取出的是整个数组的地址,但是只保存第一个元素的地址。
4.冒泡函数的实现?
//4 3 2 1 //3 2 1 4 //2 1 3 4
//3 4 2 1 //2 3 1 4 //1 2
//3 2 4 1 //2 1 3 4
//3 2 1 4
//4个元素进行3趟冒泡排序,每一趟进行元素个数减一次比较。
bubble_sort(int arr[], int sz)
{
//冒泡排序的趟数
for (int i = 0; i < sz - 1; i++)
{
//每一趟进行比较的对数
for (int j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j+1];
arr[j + 1] = arr[j];
arr[j] = tmp;
}
}
}
}
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
//打印数组的每个元素
for (int i = 0; i < sz; i++)
{
printf("%d\n", arr[i]);
}
return 0;
}
5.void*(无类型的指针)指针类型的相关知识点?
void *类型的指针可以接受任意类型的地址。
void *类型的指针不能进行解引用操作。
void *类型的指针不能进行加减整数的操作。
Eg :
int a=10 ;
void *p=&a ;
6.qsort()函数的相关知识点?
void qsort(
void *base,
size_t nmemb,
size_t size,
int (*compar)(const void *, const void *)
);
第一个参数:待排序数组的首元素地址
第二个参数,待排序数组的元素个数
第三个函数:待排序数组的每个元素的大小—单位是字节
第四个函数:是函数指针,比较两个元素所用函数的地址---这个函数使用者自己实现。
函数指针的两个参数:待比较的两个元素的地址。