C语言深度剖析指针

本文围绕C语言指针展开,介绍了指针的概念,即存放地址的变量。阐述了指针和指针类型,其类型决定移动步长;还讲解了指针的运算,如指针±整数、指针 - 指针。此外,说明了指针与数组、字符指针、指针数组等的关系,以及函数指针、函数指针数组等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.指针是什么?
在计算机科学中,指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为‘指针’。意思是通过它能找到以它为地址的内存单元。
内存 :
最小内存单元----bit
1byte=8bit
1kb=1024byte
1mb=1024kb
1gb=1024mb
总结: 指针就是变量,用来存放地址的变量(存放在指针中的值都被当成地址处理)。
2.指针和指针类型
指针定义方式为" type+* "

    int num = 10;
	int* p = #  //p是指针变量,p里存放的是num的地址

同理

    char*    pc = NULL;
	int*     pi = NULL;
	short*   ps = NULL;
	long*    pf = NULL;
	double*  pd = NULL;

**总结:**指针的类型决定了指针向前或者向后走一步有多大(距离)
3.指针的运算
1).指针±整数

#define N_VALUES 5
float values[N_VALUES];
	float *vp;
	for (vp = &values[0]; vp < &values[N_VALUES];)
	{
		*vp++ = 0;
	}

2).指针-指针
得到的是元素个数(绝对值)
比较于日期–例如,日期-日期为相差多少天

4.指针和数组

int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	printf("%p\n", arr);//首元素地址
	printf("%p\n", arr+1);//第二个元素地址
	printf("%p\n", &arr[0]);//首元素地址

	printf("%p\n", &arr);//数组地址,且数组地址和首元素地址是一样的
	printf("%p\n", &arr+1);//下一个数组地址

总结: 数组名表示的是首元素地址,除了两个例外:sizeof(arr)//arr表示整个数组
printf("%p\n",&arr)//arr表示整个数组。

5.字符指针

    char ch = 'w';
	char* pc = &ch;
	char* pstr = "hello";//将首字符的地址放到pstr里,且*pstr不可被改,“ ”是常量字符串
	printf("%s\n", pstr);

6.指针数组

int* arr1[5];
char* arr2[5];

arr1表示一个数组,有五个元素,每个元素是一个整型指针。
arr2表示一个字符数组,每个元素都是一个字符指针。

7.数组指针

int(*p)[10];

p先和*结合,说明p是一个指针变量,然后指针指向的是一个大小为10 个整型的数组。
所以p是一个指针,指向一个数组,叫数组指针。即p里存放的是数组的地址。

8.函数指针

void test()
{
	printf("hehe");
}
int main()
{
	printf("%p\n", test);
	printf("%p\n", &test);//这两种写法都可以
}

pfun可以存放Add的地址。pfun先和*结合,说明pfun是指针,指针指向的是一个函数,指向的函数参数为 int int,返回类型为int.

int Add(int a, int b)
{
	return a + b;
}
int main()
{
	int(*pfun)(int, int) = Add;
	printf("%p\n", pfun);

9.函数指针数组
把函数的地址存到一个数组中,那么这个数组就叫函数指针数组。

int(*parr[10])(int,int);

把一个函数,参数为(int,int),返回类型为int,的函数地址存放到指针数组里,即parr[10]里。

10.指向函数指针数组的指针
指向函数指针数组的指针是一个指针,指针指向一个数组,数组的元素都是函数指针。
定义:

void test(const char* str)
{
	printf("%s\n", str);
}
int main()
{
	//函数指针pfun
	void(*pfun)(const char*) = test;
	//函数指针的数组pfunArr
	void(*pfunArr[10])(const char* ) = pfun;
	pfunArr[0] = test;
	//指向函数指针数组pfunArr的指针ppfunArr
	void(*(*ppfunArr)[10])(const char*) = &pfunArr;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值