1、C/C+指针经验总结笔记 01 1: int p; /定义整型变量02 2: int *p; /定义一个整型指针03 3: int p3; /定义一个整型数组04 4: int *p3; /定义一个整型指针数组(操作符优先级高于*操作符)05 5: int (*p)3; /定义一个指向数组的指针06 6: int *p; /定义一个指针的指针07 7: int p(int); /定义一个有一个整型参数且返回值为整型的函数08 8: int (*p)(int); /定义一个指向有一个整型参数且返回值为整型的函数的指针09 9: int *(*p(int)3; /定义一个参数为整型返回值指向由整型
2、指针组成的数组的函数10 指针是一个特殊的变量(常量),它里面存储的数值被解释成为内存里的一个地址。11 12 指针的类型:13 从语法的角度看,只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。14 1: int *ptr; /指针类型:int *15 2: char *ptr; /指针类型:char *16 3: int *ptr; /指针类型:int *17 4: int (*ptr)3; /指针类型:int (*)318 5: int *(*ptr)4; /指针类型:int *(*)419 指针所指向的类型:20 从语法上看,把指针声明语句中的指针名字和名字左边的指针说
3、明符*去掉,剩下的就是指针所指向的类型。21 1: int *ptr; /指向:int22 2: char *ptr; /指向:char23 3: int *ptr; /指向:int *24 4: int (*ptr)3; /指向:int ()325 5: int *(*ptr)4; /指向:int *()426 指针指向的地址:27指针的值是指针本身存储的数值,这个值被编译器当做一个地址,而不是一个一般的数值。在 32 位程序里,所有类型的指针的值都是一个 32 位整数,因为 32 位程序里的内存地址全都是 32 位长。指针指向的内存区就是从指针的值所代表的那个内存地址开始,长度为 size
4、of 的一片内存区。指针指向了某块内存区域的首地址。28 指针本身所占据的内存区:29 用 sizeof 操作符可以获得指针本身占了多大内存。在 32 位平台里,指针本身占据了 4 个字节的长度。30 指针的算术运算:31指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值加减运算的意义不一样,以单元为单位。一个指针加或减一个整数 n 后,结果是一个新的指针。新指针和原来的指针类型相同,所指向的类型也相同。新指针比原来的指针的值增加或减少了 n*sizeof(指针所指向类型)个字节。32 两个指针不能进行加法运算,这是非法操作,因为进行加法后,得到的结果指向不明,而且毫无意义。两个指针
5、刻意进行减法运算,但类型必须相同。33 运算符52 4: int b;53 5: int c;54 6: ;55 7: 56 8: struct mystruct ss=20,30,40;57 9: struct mystruct *ptr=58 可以通过指向运算符-来使用指针访问结构成员变量。59所有 C/C+编译器在排列数组的元素时,总是把各个数组元素存放在连续的存储区里,元素和元素之间没有空隙。但在存放结构对象的各个成员时,在某种编译环境下,可能会需要字对齐、双字对齐或其他对齐方式,需要在相邻两个成员之间加若干个“填充字节”。这将导致各个成员之间可能会有若干个字节的空隙。所以不能通过*(
6、ptr+n)的方式来访问结构成员。60 61 62 指针和函数的关系:63 64 可以把一个指针声明成为一个指向函数的指针。65 66 1: int fun1(char *,int);67 2: int (*pfun1)(char *,int);68 3: pfun1=fun1;69 4: int a=(*pfun1)(“xxxxxxxx”,8);70 可以把指针作为函数的形参。在函数调用语句中,可以用指针表达式来作为实参。71 72 指针类型转换:73 如果有一个指针 p,需要把它的类型和所指向的类型改为 TYPE *TYPE,那么语法格式是:(TYPE *)p;74强制转换的结果是一个新指
7、针,该指针的类型是 TYPE *,它指向的类型是TYPE,它指向的地址就是原指针指向的地址。而原来的指针 p 的一切属性都没有被修改。75 一个函数如果使用了指针作为形参,那么在函数调用语句的实参和形参的结合过程中,必须保证类型一致,否则需要强制转换。76 指针的安全问题:77 在使用指针时,必须非常清楚指针究竟指向了哪里。在用指针访问数组的时候,也要注意不要超出数组的低端和高端界限,否则也会造成类似的错误。78在指针的强制类型转换:ptr1=(TYPE*)ptr2 中,如果 sizeof(ptr2 的类型)大于 sizeof(ptr1 的类型),那么在使用指针 ptr1 来访问 ptr2 所指向的存储区时是安全的。