//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*)
C语言中让人头疼的指针
猜你喜欢
转载自blog.csdn.net/ZhuiZhuDream5/article/details/83658696
今日推荐
周排行