指针的重要性
#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