当前位置 : 主页 > 编程语言 > c语言 >

指针详解

来源:互联网 收集:自由互联 发布时间:2023-08-28
一、指针运算 给一个指针变量+1,通常情况下不是给指针本身+1,而是”迈一步“,步长根据指针的类型来确定。 int main() {char a = 1;int b = 1;int arr[10] = { 0 };char* pa = a;int* pb = b;int(*parr)[1

一、指针运算

给一个指针变量+1,通常情况下不是给指针本身+1,而是”迈一步“,步长根据指针的类型来确定。

int main() {
	char a = 1;
	int b = 1;
	int arr[10] = { 0 };

	char* pa = &a;
	int* pb = &b;
	int(*parr)[10] = &arr;

	printf("%p\n", pa );
	printf("%p\n", pa + 1); //相差1
	printf("%p\n", pb);
	printf("%p\n", pb + 1); //相差4
	printf("%p\n", parr);
	printf("%p\n", parr + 1); //相差40
	return 0;
}

指针详解_函数指针数组

二、字符指针(char*)

char*用于存储char型变量的地址

1.通过字符指针创建常量字符串

以下是三种打印字符串的方式

int main() {
	//第一种
	char arr[] = "hello world";
	printf("%s\n", arr); //arr末尾隐藏\0,打印时读取到\0结束
  
	//第二种
	char* p1 = arr;
	printf("%s\n", p1);
  
	//第三种
	char* p2 = "hello world";
	printf("%s\n", p2);
	return 0;
}

其中第一二种为常规方式,重点分析第三种 ‘char* p2 = "hello world" ’,看似是把char型数组直接赋值给p2指针,实则不然,

因为char型指针最多存放4个字节,而hello world\0有12个字节。p2实际上是存储了首元素地址。

用第三种方式创建的字符串为常量字符串,无法被修改,最好用const加以修饰

2.例题(内容相同的常量字符串,在内存中唯一)

int main() {
	char arr1[] = "abcdef";
	char arr2[] = "abcdef";
	char* p1 = "abcdef";
	char* p2 = "abcdef"; //如果两个常量字符串完全相同,则其不会在内存中反复创建,只会创建一个,并且拥有唯一的地址

	if (arr1 == arr2)  //首元素地址不相同
		printf("相等\n");
	else
		printf("不相等\n");

	if (p1 == p2)  //首元素地址相同
		printf("相等\n");
	else
		printf("不相等\n");
	return 0;  //结果为不相等 相等
}


三、数组指针和指针数组

见数组和指针的碰撞

 

四、函数指针

1.函数指针的形式

以返回值为int,参数为(int,int)的add函数举例 (两变量相加的函数)

它的函数指针p写为:int(*p)(int,int)

int add(int a, int b) {
	int z = a + b;
	return z;
}
int main() {
	int a = 2;
	int b = 3;
	int(*p)(int, int) = &add; //(*p)表示p的本质是指针,其余的int (int,int),表示函数的返回值为int型,传参类型为(int,int)
	//int(*p)(int, int) = add 也可以行,函数名同样可以表示函数地址
	printf("%d\n", (*p)(a, b));
	printf("%d\n", p(a, b)); //p和(*p)都可以,因为函数名add <=> 函数的地址p
	return 0;
}

2.例题

指针详解_函数指针数组的指针_02

pfun1 可以存放test的地址,因为它的本质是函数指针,该函数的返回值类型为void,参数为()

pfun2本质是函数,返回值类型为void*,参数为()


五、函数指针数组

1.函数指针数组的形式

创建一个包含加减乘除函数的数组parr,可以写为int (*parr[4]) (int,int)

int add(int a, int b) {
	int z = a + b;
	return z;
}
int sub(int a, int b) {
	int z = a - b;
	return z;
}
int mul(int a, int b) {
	int z = a * b;
	return z;
}
int div(int a, int b) {
	int z = a / b;
	return z;
}
int main() {
	int(*parr[4])(int, int) = { &add,&sub,&mul,&div }; 
	for(int i=0;i<4;i++)
		printf("%d\n", (*(parr[i]))(2, 3));
	return 0;
}

函数指针数组用于存放函数类型相同的函数的地址

六、函数指针数组的指针

如果想要存储五中的parr这个指针函数数组的地址,我们可以创建函数指针数组的指针pparr,

写作:int(*(*pparr)[4]) (int, int)


上一篇:【数据结构与算法】设计循环队列
下一篇:没有了
网友评论