指针数组、数组指针、函数指针、函数指针数组详解
程序员文章站
2024-02-29 18:27:52
...
总结指针和数组部分的相关知识自己写的一遍博客:
指针是变量单元的地址,地址指向该变量单元,因此地址形象的称为“指针”,通过指针(地址)可以找到内存单元。
(总结)1.指针是存放地址才出现的,地址是为了标示一块地址空间的;
2.指针让地址有地方存放,指针让内存的访问更加方便;
3.指针的大小在32位平台是4个字节,在64位平台是8个字节。
#include <stdio.h>
int main()
{
int a = 10; //在内存中开辟一块空间,初始化为10
int *p = &a; //这里我们对变量a,取出它的地址,可以使用&操作符,地址类型为int*
//将变量a的地址存放在p变量中,p就是一个指针变量,该指针变量指向a这块空间
return 0;
}
一级指针 :变量的指针
int main()
{
int a = 10;
int *pa = &a; //整型指针pa保存变量a的地址
printf("%d\n", *pa); //解引用pa,通过指针pa找到该空间的值为10
return 0;
}
二级指针 :指针变量也是变量,是变量就有地址 ;所以变量地址的指针就是二级指针变量
int main()
{
int a = 10;
int *pa = &a; //整型指针变量pa保存整型变量a的地址
int **ppa = &pa; //ppa保存pa的地址
printf("%d\n", **ppa); //两次解引用,找到a的值为10
return 0;
}
一维数组 :
int main()
{
int arr[10] = { 0 }; //arr数组保存十个元素,数组元素初始化为0
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d\n", arr[i]); //打印arr数组的十个元素
}
return 0;
}
二维数组
int main()
{
int arr[3][3] = { 0 }; //初始化三行三列元素,每个元素初始化为0
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("%d\n", arr[i]); //打印九个元素,均为0
}
printf("\n");
}
return 0;
}
指针和数组的运算
int main()
{
int ch[5] = { 1, 2, 3, 4, 5 };
int *cp = &ch;
&ch; //取出ch空间的地址
cp; //cp保存ch空间的地址
&cp; //取出的地址为二级指针
*cp + 1; //指向数组后面的内容,随机值
*(cp + 1); //取出元素2
}
指针数组
用于存储指针的数组,也就是数组元素都是指针
数组指针指向数组的指针
int main()
{
int c[4] = { 1, 2, 3, 4 };
int *a[4]; //指针数组
int(*b)[4]; //数组指针
b = &c; //将数组c中元素赋给数组a
for (int i = 0; i<4; i++)
{
a[i] = &c[i];
}
printf("%d", *a[1]); //输出2
printf("%d",(*b)[2] ); //输出3
return 0;
}
函数指针
/*
* 求最小值
* 返回值是int类型,返回两个整数中较小的一个
*/
int min(int a, int b) {
return a < b ? a : b;
}
int(*f)(int, int); // 声明函数指针,指向返回值类型为int,有两个参数类型都是int的函数
int _tmain(int argc, char* argv[])
{
f = max; // 函数指针f指向求最大值的函数max
int c = (*f)(1, 2);
f = min; // 函数指针f指向求最小值的函数min
c = (*f)(1, 2);
printf("The min value is %d \n", c);
getchar();
return 0;
}
函数指针数组
void function0(int x)
{
;
}
void function1(int x)
{
}
void function2(int x) //函数定义
{
;
}
int main()
{
void(*f[3])(int) = { function0, function1, function2 }; //将这3个函数指针保存在数组f中
return 0;
}
上一篇: C语言指针简单介绍