谈谈对网站开发的理解,枫泾网站建设,临沂网站建设,交友免费的网站建设一#xff1a;指针的概念指针是一个特殊的变量#xff0c;里面存储的数值是内存里的一个地址。学好指针#xff0c;重要的是搞清楚指针的四个方面的内容#xff1a;指针的类型、指针所指向的类型、指针所指向的内存区、指针本身占据的内存区。1、 如何判断指针的类型呢指针的概念指针是一个特殊的变量里面存储的数值是内存里的一个地址。学好指针重要的是搞清楚指针的四个方面的内容指针的类型、指针所指向的类型、指针所指向的内存区、指针本身占据的内存区。1、 如何判断指针的类型呢12345int *p;char *p;int **p;int (*p)[3];int *(*p)[4];上面的五个声明指针的类型分别是int *、char *、int ** 、 int *[3]、int *(*)[4]是不是非常简单就是把变量名去掉剩下的就是指针的类型。2、指针所指向的类型12345int *p;char *p;int **p;int (*p)[3];int *(*p)[4];上面五个声明指针所指向的类型分别是int\char \int *\int()[3]\int *()[4]找出规律了吗就是把变量名和一个*去掉剩下的就是指针所指向的类型。特别强调指针的类型和指针所指向的类型是不同的概念。3、指针所指向的内存区或者指针的值指针的值是指针本身所存储的数值这个值被编译器当作一个地址而不是而不是一个一般的数值。在32位程序里所有的类型的指针的值都是一个32位数因为32位程序中内存地址全部都是32位字长。指针所指向的内存区就是从指针的值所代表的内存区开始长度为sizeof指针所指向的类型的一篇内存区。以后我们说一个指针的值是XX就代表了该指针指向了以XX为首地址的一片内存区域我们说一个指针指向了某个内存区域相当于指针的值就是该内存区域的首地址。指针指向谁就把谁的地址赋给指针。4、指针本身所占据的内存区指针本身占据了多大的内存。用sizeof指针的类型测试一个就知道了。在32位平台里指针本身占据了四个字节的长度。二、指针的算术运算123char a[20];int *pa;p;指针p的类型是 int * 指针所指向的类型是int 它被初始化位指向整形变量a接下来指针p被加了1编译器是这样处理的它把指针p的值加上了sizeofint在32位程序里是加上了4.由于地址是用字节做单位的故p的地址由原来的a的地址指向了加四个字节后的高地址。由于char类型的长度是一个字节所以原来p是指向数组从0开始的四个字节现在指向了从第四个字节开始的四个字节我们可以用一个指针和一个循环来遍历一个数组12345678int arr[20];int *parr;.......//此处略去整数型赋值的代码for(i 0; i20 ; i){(*p);P; }这个例子将整数型数组各个单元的值加1由于每次循环都将指针p所以每次循环都能访问数组的下一个单元。12345char a[20];int *pa;......p5;在这个例子中p被加上了5从编译器的角度看将指针p的值加上sizeofint在32位恒旭中就是加上了5*420.由于地址的单位十字街故现在p指向刚开始高字节方向的20个字节。在这个例子中没加5之前的p指向数组第0个单元开始的四个字节加5后p已经指向数组的合法范围之外了。虽然这种情况在应用上会出现问题但在语法上是可以。这体现了指针的灵活性。总结一下:一个指针加上一个整数n后结果是一个新的指针pnewpnew的类型和pnew所指向的类型与pold的类型都是一样的。pnew的值比起pold的值增加了n*sizeofp指向的类型个字节。加是往高字节移动减是往低字节移动。三运算符和*是取地址运算符*在书上叫做间接运算符。a的运算结果是一个指针指针的类型是a的类型加一个*。指针所指向的类型是a的类型指针所指向的地址就是a的地址。*p的结果是p所指向的结果类型是p的类型占用的地址就是p所指向的地址123456789101112int a 12;int b;int *p;int *ptr;pa//a的结果是一个指针指针的类型是一个int *指针所指向的数据类型是int ,指向的地址是a的地址。*p24;//*p的结果它的类型是int它所占用的地址是p所指向的地址显然*p就是变量a*ptrP;//p本身就是一个指针了对p在取地址那么 该指针的类型是int **,指针所知下个的类型是 int * 。指针所指向的地址就是p的地址**ptr34;// *ptr的结果就是ptr所指向的东西。在这里是一个指针对这个指针在做一次*运算。结果就是一个int 类型的变量四指针表达式一个表达式的最后结果如果是一个指针这个表达式就叫做指针表达式1234567891011121314151617int a ,b ;int array[10];int *pa;paa;//指针表达式int **ptr pa;//表达式*ptrb;//表达式paarray;pa//表达式char arr[20];char **parr arr//如果把arr看作指针的话arr也是指针表达式char *str;str*parr;//指针表达式str*(parr1);//指针表达式由于指针表达式的结果是一个指针所以指针表达式也需要具有指针的四个要素指针的类型指针所指向的类型、指针指向的内存区、指针自身占据的内存区。指针在左边表示赋值指针在右边表示取值。五、数组和指针的关系12345678int array[10] {0,1,2,3,4,5,6,7,8,9},value;......value array[0];//也可以写成 value *array;value array[3];//也可以写成 value *(array3);value array[4];//也可以写成 value *(array4);上例中一般而言数组名array代表数组本身类型是int[10];如果把array看作指针的话它指向数组的第0个单元类型是int *所指向的类型是数组单元的类型 int ,因此*array 0 就一点也不奇怪了。同理array3指向数组单元的第三个指针所以*array3 3 123456789char *str[3] {Hellp,this is a sample,Hi ,good morning ,Hello world};char s[80];strcpy(s,str[0]);//也可以写成 strcpy(s,*str);strcpy(s,str[1]);//也可以写成strcpy(s,*(str1));上例中str是一个三单元的数组该数组的每个单元都是一个指针这些指针每个都指向一个字符串如果把数组名看作指针的话它指向数组的第0号元素类型是char** ,指向的类型是 char *;*str 也是一个指针它的类型是char*指向的类型是char ,它指向的地址是字符串 “Hello,this is a sample”的第一个字符H的地址。*str1也是一个指针他的类型是char*指向的类型是char指向“Higood morning”的第一个字符H的地址。在不同的表达式中数组名array可以扮演不同的角色 。在表达式sizeof(array)数组名array 代表数组本身故测出的是整个数组的大小。在表达式*array中array扮演的是一个指针所以该表达式就是数组第0号单元的值。sizeof*array测出的是数组单元的大小。表达式arraynarray扮演的是指针故arrayn也是指针他的类型是type*指向的类型是type指向数组第n号单元故sizeofarrayn测出的是指针类型的大小。六、指针和结构类型的关系1234567891011struct mystruct{int a ;int b;int c; }mystruct ss {20,30,40};mystruct *ptr ss;//声明了一个指向结构对象ss的指针它的类型是myStruct * ,指向的类型是mystructint *pstr (int *)ss//声明了一个指向结构对象ss的指针。但是他的类型和它指向的类型和ptr是不同的请问如何通过指针ptr来访问ss的三个成员变量答案12345678910ptr -a;ptr -b;ptr -c;请问如何通过指针pstr来访问ss的三个成员变量答案*pstr;*(pstr1);*(pstr2);这样使用pstr来访问结构成员是不正规的。那么该怎么样来通过指针访问数组的各个单元呢123456int array[3]{35,56,37};int *pa array;//通过指针pa访问数组array的三个单元的方法是*pa;*(pa1);*(pa2);从格式上看倒是与通过指针访问结构成员的不正规方法的格式一样.所有的C/C编译器在排列数组的单元时总是把各个数组单元存放在连续的存储区里单元和单元之间没有空隙。但在存放结构对象的各个成员时在某种编译环境下可能会需要字对齐或双字对齐或者是别的什么对齐需要在相邻两个成员之间加若干个“填充字节”这就导致各个成员之间可能会有若干个字节的空隙。所以在例十二中即使*pstr访问到了结构对象ss的第一个成员变量a也不能保证*(pstr1)就一定能访问到结构成员b。因为成员a和成员b之间可能会有若干填充字节说不定*(pstr1)就正好访问到了这些填充字节呢。这也证明了指针的灵活性。要是你的目的就是想看看各个结构成员之间到底有没有填充字节嘿这倒是个不错的方法。