C语言中让人头疼的指针

 //1.指针是个变量,存放内存单元的地址。存放在指针中的值都被当作地址来处理
//一个小的单元到底有多大?(一个字节这么大)
//我们需要明白:
//    在32位的机器上,地址是32个0或1组成的二进制序列,那么地址就得用4个字节的空间来存储(一个字节是8位二进制数),所以一个
//指针变量的大小应该是4个字节。
//    在64位的机器上,如果有64个地址线,那么一个指针变量的大小是8个字节。
////2.指针的类型
////实例演示:
//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
//	int n = 10;
//	char* pc = (char*)&n;
//	int* pi = &n;
//	printf("%p\n", &n);
//	printf("%p\n", pc);
//	printf("%p\n", pc + 1);
//	printf("%p\n", pi);
//	printf("%p\n", pi + 1);
//	system("pause");
//	return 0;
//}
////总结:指针的类型决定了指针向前或者向后走一步有多大的距离即每次加1后移动几个字节
////在这个实例中,char每次移动一个字节,int每次移动4个字节。
////注意:在C语言中char占一个字节,java中char占两个字节。

////3.指针的解引用
////实例演示
//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
//	int n = 0X11223344;
//	char* pc = (char*)&n;
//	int* pi = &n;
//	*pc = 0X55;//重点观察调试过程的变化
//	*pi = 0;
//	system("pause");
//	return 0;
//}
////总结:指针的类型决定了对指针的解引用时能有多大的权限(能操作几个字节)。比如:char*的指针解引用就只能访问一个字节,而int*的
////指针的解引用就只能访问4个字节。

////4.指针的运算
////(1)指针+/-整数
//#define N_VALUES 5
//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
//	float values[N_VALUES];
//	float* vp;
//	//指针+/-整数;指针的关系运算
//	for (vp = &values[0]; vp < &values[N_VALUES];)
//	{
//		*vp++ = 0;
//	}
//	system("pause");
//	return 0;
//}

//5.指针和数组
//既然可以把数组名当成地址存放到一个指针中,我们使用指针来访问一个数组就成为可能
//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
//	int* p = arr;//指针存放数组首元素地址
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("&arr[%d]=%p  <===>  p+%d=%p\n", i, &arr[i], i, p + i);
//	}
//	system("pause");
//	return 0;
//}
//通过这个结果,我们可以看出可以直接通过指针来访问数组。

//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
//	int* p = arr;//指针存放数组首元素地址
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("arr[%d] = %p\n",  i, p + i);
//	}
//	system("pause");
//	return 0;
//}

//6.二级指针
//指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?这就是二级指针
//int a = 10;            =====>变量a
//int* pa = &a;          =====>一级指针变量pa,存放a的地址(&a是取a的地址)
//int* ppa = &pa;        =====>二级指针变量ppa,存放pa的地址(&pa是取pa的地址,pa是a的地址)
//对于二级指针有:
//(1)*ppa通过对ppa中地址的访问,找到的是pa,*ppa其实访问的就是pa
//int b=20;
//*ppa = &b;<===>pa=&b
//(2)**ppa先通过*ppa找打pa,然后对pa进行访问:*pa,那么找到的就是a。即是:**ppa<===>*(*ppa)<===>*pa<===>a
//**ppa = 30; <===> *pa = 30; <===> a = 30;
//注意:一个*表示访问一次紧挨的变量,顺序即是从右往左。

//7.指针数组
//指针数组是指针还是数组?
//答:是数组。是存放地址的数组。
//int arr[5];(5个挨着存放的int*)

猜你喜欢

转载自blog.csdn.net/ZhuiZhuDream5/article/details/83658696
今日推荐