指针进阶,深入理解指针

1.字符指针

 指针进阶,深入理解指针_第1张图片

int main()
{
	char c = 'w';
	char* pc = &c;
	printf("%c\n", *pc);
	char* str = "abcdef";//将字符串常量的首地址赋给str
	//注意不能通过str修改内容,因为“abcdef”是字符串常量,存放在常量区中,是只读的
	//*str = 'w';
	printf("%s\n", str);
	/*int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7 };
	int* parr[3] = { arr1, arr2, arr3 };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			printf("%d ", *(parr[i] + j));
		}
		printf("\n");
	}*/
	return 0;
}

上面代码需要注意的是不能通过指针来修改字符串常量的值,这一定要引起重视,因为大部分编译器不会对该操作报错,这样就产生了难以发现的bug,若要解决,应在指针声明时加上const修饰。如下:

int main()
{
	const char* pc = "abcdef";
	*pc = 'w';
    //编译器会报错,因为加上const后,无法通过指针来改变变量的值;
}

(2)面试题

int main()
{
	char* p1 = "abcdef";
	char* p2 = "abcdef";
	char arr1[] = "abcdef";
	char arr2[] = "abcdef";
	
	if (p1 == p2)
	{
		printf("p1 == p2\n");
	}
	else
	{
		printf("p1 != p2\n");
	}
	if (arr1 == arr2)
	{
		printf("arr1 == arr2\n");
	}
	else
	{
		printf("arr1 != arr2\n");
	}
	return 0;
}

运行如下:

指针进阶,深入理解指针_第2张图片

 为什么会出现以上结果呢?因为“abcdef”已经存放在常量区了,计算机为了节省空间,则创建的指针都指向同一个字符串常量,而对于数组,则在栈区开辟空间,新的数组会开辟不同的空间,只是以“abcdef”进行初始化,所以地址值会不同。

2.指针数组

指针数组的定义:type* pa[numbers] 表示数组元素为指向type的指针,元素个数为numbers。

使用:

int main()
{
	int arr1[] = { 1,1,2 };
	int arr2[] = { 2,3,4 };
	int* arr[] = { arr1, arr2 };//存放数组首元素的首地址

	return 0;
}

3.数组指针

定义:(应与指针数组区别)type (*p)[numbers], 表示一个指针,指向了元素类型为type的数组

使用: (1)打印一维数组

void print(int(*p)[5], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(*p + i));//p解引用得到的是数组名
	}
}

int main()
{
	int arr[] = { 1,2,3,4,5 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	print(&arr, sz);

	return 0;
}

但是这种方式相比下标引用显得十分复杂,并没用必要使用,但是二维数组的使用就能方便的使用了。

(2)二维数组的打印

void print(int(*p)[5], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf("%d ", *(*(p + i) + j));
            //p + i 找到第i行,解引用得到第i行,最后相当于一维数组的使用
		}
	}
	printf("\n");
}

int main()
{
	int arr[][5] = { {1,2,3,4,5}, {2,3,4,5,6}, {3,4,5,6,7} };
	//int sz = sizeof(arr) / sizeof(arr[0]);
	print(arr, 3, 5);//arr表示二维数组首元素的地址:&arr[0],实际上指向第0行

	return 0;
}

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