【c语言】深入理解指针(2)

1. 字符指针变量

可以利用字符指针存放字符数组来间接存放字符串。

int main()
{
	char arr[10] = "abcdef";
	char* p = arr;
	printf("p  = %s\n", p);
	return 0;
}

那我们可不可以直接给字符指针存放字符串呢? 

int main()
{
	char* p1 = "abcdef";
	printf("p1 = %s\n", p1);
	return 0;
}

我们来看一下结果:

【c语言】深入理解指针(2)_第1张图片

可以看到是可以直接给字符指针存放字符串,其实指针仅仅存放了字符串首字母的地址,%s会根据这个首字母的地址依次打印字符,当遇到空字符‘\0’则会停止打印,从而打印出了完整的字符串。

字符指针存放字符数组的字符串可修改,而存放字符串字面量不可修改,因为

  • 当字符指针指向一个字符数组时,该数组通常在栈上或堆上分配内存空间,这块内存是可以被修改的。
  • 当字符指针直接指向一个字符串字面量时,该字面量通常存储在程序的只读数据段,这部分内存是不可以修改的。

【c语言】深入理解指针(2)_第2张图片

《剑指offer》中收录了⼀道和字符串相关的笔试题,我们⼀起来学习⼀下:

#include 
int main()
{
	char str1[] = "hello bit.";
	char str2[] = "hello bit.";
	const char* str3 = "hello bit.";
	const char* str4 = "hello bit.";
	if (str1 == str2)
		printf("str1 and str2 are same\n");
	else
		printf("str1 and str2 are not same\n");

	if (str3 == str4)
		printf("str3 and str4 are same\n");
	else
		printf("str3 and str4 are not same\n");

	return 0;
}

先来看str1和str2,在一篇文章中已经讲过数组名是数组首元素的地址,所以str1和str2分别是数组str1[]和数组的str2[]的首地址,而两个不同的数组是不会存放在同一个位置的,所以str1和str2是不相等的。

再来看str3和str4,str3和str4都是存放常量字符串的首地址,而当字符指针直接指向一个字符串字面量时,该字面量通常存储在程序的只读数据段,在只读数据段中是不会开辟两个空间存放相同的字面量的,也就是说*str3和*str4指向的"hello bit."是同一个字符串,所以str3和str4存放的地址是相同的。

2. 数组指针变量

3. 二维数组的传参本质

4. 函数指针变量

5. 函数指针数组

6. 转移表

你可能感兴趣的:(c语言,开发语言)