0
点赞
收藏
分享

微信扫一扫

2022-1-15 指针

caoxingyu 2022-01-15 阅读 41
c语言

0.#define typedef的区别

{

typedef int* INT;
#define int* Int;

int main()
{
	INT pa, pb;
	Int pc, pd;
	return 0;
}

 typedef就相当于是定义了一个新的关键字 INT 它定义的所有变量都是指针类型

而#define只是把int*换成了Int

所以我们得到的pa,pb都是指针变量

而pc是指针变量,pd不是。

}

1.字符指针,贴代码:

int main()
{
	char ch = 'w';
	char* p = "abcdef";
	*p = ch;
	printf("%c", *p);
	return 0;
}

一般认为这个会打印出来w而不是a因为p仅仅是一个字符指针字节大小不够存下abcdef\0这些字符所以默认是a,但是程序会报错因为这样定义的p只存储在内存中的只读数据区不能被修改。

由此可以得出结论,这样的定义方式与int const*p='a'是等价。

2.

关于int const*和 int *const的区别在于

前者是指针指向的对象不可被修改,而后者是指指针变量本身不可以被修改:运行结果如下

int main()
{
	char ch = 'w';
	const int* p = &ch;
	*p = 'a';
	printf("%c", *p);
	
	return 0;
}

 

 

int main()
{
	char ch = 'w';
	char c = 'h';
	int* const p = &ch;
	printf("%c", *p);
	p = &c;
	return 0;
}

 

下面看一道笔试题:

int main()
{
	char arr1[] = "abcd";
	char arr2[] = "abcd";
	char* arr3 = "abcd";
	char* arr4 = "abcd";
	if (arr1 == arr2)
		printf("yes\n");
	else
		printf("no\n");

	if (arr3 == arr4)
		printf("yes\n");
	else
		printf("no\n");
	return 0;
}

 结果:

 理由:

arr1与arr2虽然内容相同但是是两个不同的字符数组,存储在内存中的位置当然不相同,所以二者不相等

而arr3与arr4根据前面的结论我们知道二者都存的是常量字符'a',而二者都一样没有必要再使用一个块空间,故二者相等。

3.指针数组。

顾名思义 由整型数组、字符数字、浮点数组可知,指针数组是用来存储指针变量的数组

下面简简单单贴一点代码分析玩玩~

int main()
{
	int* arr1[] = { "abcd","efgh","hijk" };
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s\n", arr1[i]);
	}
	return 0;
}

 

 根据之前学过的字符串只是,指针数组里面存放的是指针变量,当然可以用来存储字符串,故打印出来是字符串形式,其相关大小为:

显然指针数组里面存放了12个字符,一个字符是一个字节,所以他的大小是12个字节;

int main()
{
	int arr1[5] = { 1,2,3,4,5 };
	int arr2[5] = { 6,7,8,9,10 };
	int arr3[5] = { 11,12,13,14,15 };
	int *arr[] = { arr1,arr2,arr3 };
	int i = 0;
	int j = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++)
	{
		for (j = 0; j < 5; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

 

 

是不是看到了两个方块想起来了二维数组?确实我们说指针和数组有相似的地方,但是显然二者又不尽相同 。

类似的我们可以像操纵二维数组那样来改写这个代码

int main()
{
	int arr1[5] = { 1,2,3,4,5 };
	int arr2[5] = { 6,7,8,9,10 };
	int arr3[5] = { 11,12,13,14,15 };
	int *arr[] = { arr1,arr2,arr3 };
	int i = 0;
	int j = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++)
	{
		for (j = 0; j < 5; j++)
		{
			printf("%d ", *(*(arr+i)+j));
		}
		printf("\n");
	}
	return 0;
}

这样我们得到结果是一样的。

分析:

arr可以看作是二级指针,他加了i之后解引用就指向arr1(2,3),再对其 +j解引用就指向了上面三个数组中的元素,所以得到的结果与上面的代码一样。

举报

相关推荐

0 条评论