标签:指针
指针的重要性
#include <stdio.h> /* 指针的重要性: 1,表示一些复杂的数据结构 2,快速的传输数据 3,使函数返回一个以上的值 4,能直接访问硬件 5,能够方便的处理字符串 6,是理解面向对象语言中引用的基础 总结:指针是c语言的灵魂 指针的定义: 地址: 内存单元的编号 从零开始的非负数整数 范围:如果是32位的机器就是从【0--4G-1】 指针: 指针就是地址,地址就是指针 指针变量就是存放内存单元编号的变量,或者说指针变量就是存放地址的变量 指针(0019FF38)和指针变量(p)是两个不同的概念 但是要注意:通常我们叙述时会把指针变量简述为指针,实际含义并不一样 指针的本质就是一个操作受限的非负整数(不能加乘除,可以减) 指针的分类: 1,基本类型指针 int * p; // p是变量的名字,int *表示p变量存放的int类型变量的地址 // int *p 不表示定义了一个名字叫做*p的变量 // int *p 应该这样理解:p是变量名,p变量的数据类型是int *类型 // 所谓int *类型实际就是存放int变量地址的类型 int i = 3; int j; p = &i; 1,p保存了i的地址,因此p指向i 2,p不是i,i也不是p,更准确的说,修改p的值不会影响i的值,修改i的值也不会影响p的值 3,如果一个指针变量指向了某个普通变量,则 *指针变量 就完全等同于 普通变量 例子: 如果p是个指针变量,并且p存放了普通变量i的地址 则p指向了普通变量i *p 就完全等同于i 或者说:在所有出现*p的地方都可以替换成i 在所有出现i的地方都可以替换成*p printf("%d\n",i); //输出3 printf("%d\n",*p); //输出3 *p 就是以p的内容为地址的变量 j = *p; printf("i = %d ,j = %d ,*p = %d \n",i,j,*p); //结果i = 3 ,j = 3 ,*p = 3 2,指针和数组 3,指针和函数 4,指针和结构体 5,多级指针 */ int main(void) { return 0 ; }
常见错误1
#include <stdio.h> int main(void) { int i = 5 ; int * p ; int * q; p = &i; //q = &i; //*q = p; //error语法编译会出错 在这里*q是一个值,是一个int类型 而p是int * 是个地址,类型不一致,所以报错 //*q = *p; //因为q没有赋值,相当于没有地址,所以会分配垃圾地址,造成非授权访问,为了避免非授权访问,所以程序报错 // p = q; q是垃圾值,q赋给p p也变成垃圾值 printf("%d\n",*q); //q的空间是属于本程序的,所以本程序可以读写q的内容,但是q的内部是垃圾值,则本程序不能读写*p的内容 return 0; }
常见错误2
#include <stdio.h> //把5赋值给了一个不知道的单元,所以程序报错 int main(void) { int * p; int i = 5; *p = i; printf("p的地址是%p\n",&p); printf("i的地址是%p\n",&i); printf("*p的值是%d\n",*p); //printf("%d\n",*p); return 0; }
经典程序互换两个数字
#include <stdio.h> /* *号的含义: 1,乘法 2,定义指针变量 3,指针运算符 该运算符放在已经定义好的指针变量的前面 如果p是一个定义好的指针变量 则*p表示以p的内容为地址的变量 */ void huhuan_1(int ,int ); void huhuan_2(int * , int *); void huhuan_3(int * , int *); int main() { int a = 3 ; int b = 5; huhuan_1( a, b); printf("a=%d,b=%d\n",a,b); //a=3,b=5 huhuan_2( &a, &b); //huhuan_2( a, b);错误; huhuan_2( *p, *q);也是错误的 printf("a=%d,b=%d\n",a,b); //a=3,b=5 huhuan_3( &a, &b); printf("a=%d,b=%d\n",a,b); //a=5,b=3 return 0; } //不能完成互换 void huhuan_1(int a,int b) { int t; t = a; a = b; b = t; return; } //不能完成互换 void huhuan_2(int * p, int *q) //因为p和q才是变量,存储的是地址,所以在主函数里传过来的也是地址,所以是 huhuan_2( &a, &b); { int * t; t = p; p = q; q = t; } //可以完成互换 void huhuan_3(int * p, int *q) { int t; //如果要互换*p和*q的值,则t必须定义成int,不能定义成int* 否则语法报错 t = *p; //p是int * ,*p的int *p = *q; *q = t; }
标签:指针
原文地址:http://blog.51cto.com/tdcqvip/2120837