输出其它地址:是地址
输出字符串数组名:是从字符串首地址开始到‘\\0’为止的字符串 输出其它数组名:是个地址
可以能过变量名(直接访问)和*p来得到变量(间接访问) p1是保存地址的变量
*p1是保存地址中变量的变量 给*p1赋值,p1的值不会改变
如int *p; char c;
p=&c;//错误不可以将char* 赋给int *
//用指针作形参:可以在函数中改变实参的值。
//一个指针总是占有4个字节的指针 //形参中的数组,实质是一个指针。 void print(double a[],int n) {
cout< int main() { double a[5]={1.1,2.2,3.3,4.4,5.5}; cout< 字符串指针------------(以下一、二、三的区别) 一、/字符串常量-------------在内存中是匿名的字符数组,放在静态存储区。 const char *p=\加上const,表示*p所指向的变量是常量,不能再被赋值,而p是一个指针变量可以再被 赋值 如: *p=\错误。 p=\正确。因为这个是p中所保存的地址改变,并没有去改变p中地址的值 二、char* const q;表示指向字符串变量的指针常量,---就是说q不可以再被赋值,而*q可以再被 赋值。 三、指向字符串常量的指针常量-------------指针常 量表示指针中的地址不可以再被赋值,*q也不可以再被赋值 const char* const q=\, cout< q=\错误 ,q的地址不可以在改变 注意:凡是常量都应该初始化,如有了默认值,再赋值,错误。因为不会再有每二次机会再给他赋值 /* 命令行参数:argv[0]=\用户输入 \ argc至少为1 */ int main(int argc,char* argv[]) { cout<<\ for(int i=0;i cout<<\ } return 0; } 注意:加头文件-------#include atoi(argv[i]):把一个命令行上的数字字符串转化为整数 atof(argv[i]):把一个命令行上的数字字符串转化为实数 itoa:把一个整 数转化为一个数字字符串 结构指针:保存结构变量地址的指针 注意:C中不能直接使用结构体名,要struct 结构体名 结构体变量={};--------而C++可以 结构体名 结构体变量={}; C中可以type struct 结构体名{。。。。。} 新名字; //实参是结构体变量的地址,形参是指向结构体变量的指针 struct Product{ char name[20]; double price; };//注意分号 void show( Product* p) { cout<<(*p).name<<\写两种表示方法等价 cout< int main() { Product a={\冰箱\ show(&a);// } //二级指针:保存指针地址的变量 int a=10; int *p=&a; cout<<\cout<<\int** r=&p; cout<<\是&p的地址 cout<<\是&p中的内容,即&a cout<<\是&a中的内容,即a cout<<\是**r本身的地址 int***** k=NULL;(防止野指针)----称为空指针 cout<<\结果k=0表示指向地址为的地方 如:strcpy(到,串) ------也可以像操作字符串一样,操作内存 memcpy(到,从,字节数); //内存的复制 memset(地址,数据,字节数) //内存的填充 memcmp(地址1,地址2,字节数)//比较两块内存的大小 下面程序完成内存的复制 /* void*表示不管什么类型的地址。 用到const,表示所指向变量 是个常量 */ void Copy(const void* from,void* to,int bytes)//形参是两个指向任何类型的指针,所以下面要强制类型转 换 { char* f=(char*)from;//转 换在char*,任何一个类型都可以一个字节一个字节的操作。是因为指针++表一个字节 char* t=(char*)to; for(int i=0;i int main() { double d1=123.456,d2=567.123; int n1=123456,n2=4556; int a1[5]={11,12,13,14,15}; int a2[8]={0}; Copy(a1,a2,sizeof(a1));//把a1内存地址中的内容复制到a2内存地址中 Copy(&d1,&d2,sizeof(d1)); Copy(&n1,&n2,sizeof(n1)); for(int i=0;i<8;i++) cout< cout<<\结果:d2=123.456 cout<<\结果:n2=123456 } 指向函数的指针:一个函数在编译时被分配一个入口地址,这个函数的入口地址就称为函数的指针, (可以用一个指针变量指向一个函数,然后通过该指针变量调用些函数) void f1(int n) { cout< int main() { cout<<&f1< cout<<\转 换在void*输出函数的地址, cout<<\函数的地址,可以和数组地址一样,不用& typedef void A(int n);//将void类型 有参数的函数,取别名A A* q=f1; q(5);//调用f1,传入参数5 void(*r)(int n)=f2;//定义一个指向函数的指针,该函数返回值为void ,传入参数为一个int, r(123);//调用f2,传入参数123-----和上面的方法等价,但上一种比较笨拙 } /* 函数的指针作为形参;这样函数由第三方来调用,函数有更好的通用性。 */ bool rule(int x,int y) { return x>=y; } bool rule2(int x,int y)//比个位 { return x>=y; } int findmax(int a[],int n,bool(*p)(int,int)) { int m=a[0]; for(int i=1;i if(!p(m,a[i])) m=a[i]; } return m; } //rule()是一个规则:用来比较两个数据,如果符合规则就返回true,否则就返回false int main() { int a[5]={1,95,520,12,52}; cout< cout< ********************************************************************************************* *********************2010年09月14日 星期二 09时55分19秒 (第八天)********************************** 指针数组:一个数组,其元素均为指针 int *p[5]; (p与[]结合,表p是数组,再与*结合,表示此数组每个元素是int * 区别于数组的指针:int (*p)[]; (p与*结合,表示p是指针,表示它指向int[] 成员指针: /* int Date::*p 表int型的Data成员的地址。 for(int i=0;i cout< for(int i=0;i for(int i=0;i