C/C++指针 数组
2014-01-20 20:59
405 查看
Demo.cpp文件
headFile.h
headFile.cpp
Object.h
#ifndef OBJECT_H
#define OBJECT_H
class Object
{
public:
void retrieve(void) { printf(" Object::retrieve\n"); }
void insert(void) { printf(" Object::insert\n"); }
void update(void) { printf(" Object::update\n"); }
void process(int choice);
private:
typedef void (Object::*Omf)();
static Omf farray[3];
};
Object::Omf Object::farray[3]= { &Object::retrieve,
&Object::insert,
&Object::update
};
void Object::process(int choice)
{
if(0<= choice && choice <=2)
(this->*farray[choice])();
}
#endif
#include <iostream> #include <stdio.h> #include <iomanip> #include <ctime> #include "headFile.h" #include "Object.h" using namespace std; int main(int argc,char *argv[]) { #ifdef X1 // int i=7,j=8; printf("i==%d,&i==%p\n",i,&i); cout<<"j=="<<j<<" &j=="<<&j<<endl; #endif #ifdef X2 // int i=7,j=8; int *ip=&i; int *jp=&j; cout<<"Address: "<<ip<<" contains: "<<*ip<<endl; cout<<"Adderss: "<<jp<<" contains: "<<*jp<<endl; *ip=9; *jp=10; cout<<"Now Address: "<<ip<<" contains: "<<*ip<<endl; cout<<"Now Adderss: "<<jp<<" contains: "<<*jp<<endl; #endif #ifdef X3 // int i=7; int *ip=&i; int **ipp=&ip; cout<<"Address: "<<ip<<" constains: "<<*ip<<endl; cout<<"Address: "<<ipp<<" contains: "<<*ipp<<endl; cout<<"***ipp== "<<**ipp<<endl; #endif #ifdef X4 // float a[]={1.0,2.0,3.0}; cout<<"sizeof(float)=="<<sizeof(float)<<endl; float *p=&a[0]; cout<<"p=="<<p<<" *p=="<<*p<<endl; ++p; cout<<"p=="<<p<<" *p=="<<*p<<endl; ptrdiff_t diff=(p+1)-p; cout<<"diff=="<<diff<<endl; diff=(char*)(p+1)-(char*)p; cout<<"diff=="<<diff<<endl; #endif #ifdef X5 // int i=7; char *cp=(char*)&i; cout<<"The integer at "<<&i<<"=="<<i<<endl; for(int n=0;n<sizeof(i);++n) cout<<"The byte at"<<(void*)(cp+n)<<"=="<<int(*(cp+n))<<endl; #endif #ifdef X6 // unsigned short date,year=92,mon=8,day=2; date= (year<<9) | (mon<<5) | day; cout<<hex<<date<<endl; #endif #ifdef X7 // struct Date { unsigned day:5; unsigned mon:4; unsigned year:7; }; unsigned short date,year=92,mon=8,day=2; Date *dp=(Date*)&date; dp->mon=mon; dp->day=day; dp->year=year; cout<<hex<<date<<endl; cout<<dec<<"year:"<<int(dp->year)<<" "; cout<<dec<<"mon:"<<int(dp->mon)<<" "; cout<<dec<<"day:"<<int(dp->day)<<endl; #endif #ifdef X8 // int i=7,j=8; swap(&i,&j); cout<<"i=="<<i<<" j=="<<j<<endl; #endif #ifdef X9 // char source[]="1234"; char tar[]="********"; memcpy(tar,source,strlen(source)); cout<<source<<" "<<" "<<tar<<endl; #endif #ifdef X10 // char c='a'; short i=100; long n=10000L; double pi=3.141529;// 40 *9 21 D9 F4 D3 7C 13 char s[]="hello"; char az[]="abcdefghijklmnopqrstuvwxyz";// 61~7A char AZ[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";// 41~5A inspect(&c,sizeof(c)); cout<<endl; inspect(&i,sizeof(i)); cout<<endl; inspect(&n,sizeof(n)); cout<<endl; inspect(&pi,sizeof(pi)); cout<<endl; inspect(s,sizeof(s)); cout<<endl; inspect(az,sizeof(az)); cout<<endl; inspect(AZ,sizeof(AZ)); cout<<endl; #endif #ifdef X11 // int a[]={1,2,3,4,5}; int *p=a; cout<<"sizeof(a)=="<<sizeof(a)<<endl; cout<<"sizeof(p)=="<<sizeof(p)<<endl; cout<<"p=="<<p<<" &a[0]=="<<&a[0]<<endl; cout<<"*p=="<<*p<<" a[0]=="<<a[0]<<endl; p=a+2; cout<<"p=="<<p<<" &a[2]=="<<&a[2]<<endl; cout<<"**p=="<<*p<<" a[2]=="<<a[2]<<endl; #endif #ifdef X12 // int a[]={1,2,3,4,5}; size_t n=sizeof(a)/sizeof(a[0]); for(int i=0;i<n;++i) cout<<a[i]<<' '; cout<<endl; for(i=0;i<n;++i) cout<<i[a]<<' '; cout<<endl; int* p=a; while(p<a+n) cout<<*p++<<' '; cout<<endl; p=a; for(i=0;i<n;++i) cout<<p[i]<<' '; cout<<endl; for(i=0;i<n;++i) cout<<*(a+i)<<' '; cout<<endl; p=a+n-1; while(p>=a) cout<<*p--<<' '; cout<<endl; p=a+n-1; for(i=0;i<n;++i) cout<<p[-i]<<' '; cout<<endl; #endif #ifdef X13 // 匿名数组 char a[]="hello"; char *p=a; cout<<"a=="<<&a<<" sizeof(a)=="<<sizeof(a)<<endl; cout<<"p=="<<(void*)p<<" sizeof(p)=="<<sizeof(p)<<endl; cout<<"sizeof\"hello\"=="<<sizeof("hello")<<endl; cout<<"address of \"hello\"=="<<(void*)"hello"<<endl; cout<<"address of \"hello\"=="<<(void*)"hello"<<endl; #endif #ifdef X14 // char c[]="0123456789"; for(int i=0;i<10;i+=2) cout<<c[i]<<' '; cout<<endl; for(i=0;i<10;i+=2) cout<<"0123456789"[i]<<' '; // 经典 cout<<endl; #endif #ifdef X15 // int a[]={10,15,4,1,3,-4}; int *p=&a[2]; int *q=&a[2]; cout<<*(p+1)<<endl; cout<<p[-1]<<endl; cout<<p-a<<endl; cout<<a[*p++]<<endl; // *p++ = 4 = a[2] cout<<a[*++q]<<endl; // *++q = 1 = a[3] cout<<*(a+a[2])<<endl; #endif #ifdef X16 // int a[]={0,1,2,3,4}; size_t n=sizeof(a)/sizeof(a[0]); cout<<"a=="<<a<<endl; cout<<"sizeof(a)=="<<sizeof(a)<<endl; func(a,n); for(int i=0;i<n;++i) cout<<a[i]<<' '; cout<<endl; #endif #ifdef X17 // Lincoln实验室 Chet Small 提供的这个聪明的例子 char s[]="desolate",*p=s; cout<<*p++<<endl; cout<<*(p++)<<endl; cout<<(*p)++<<endl; cout<<*++p<<endl; cout<<++*p<<endl; cout<<++(*p)<<endl; // StrCmp(s,?)==0 ?中 应该是什么 才能满足此表达式 #endif #ifdef X18 // 指向字符串的指针数组 有个别名叫 “粗糙数组” char* strings[]={"now","is","the","time"}; size_t n=sizeof(strings)/sizeof(strings[0]); for(int i=0;i<n;++i) cout<<"string"<<i<<"==\""<<strings[i] <<"\"\tsize=="<<sizeof(strings[i]) <<"\tlength=="<<strlen(strings[i])<<endl; #endif #ifdef X19 // char strings[][5]={"now","is","the","time"}; size_t n=sizeof(strings)/sizeof(strings[0]); for(int i=0;i<n;++i) cout<<"strings["<<i<<"]==\""<<strings[i] <<"\"\tsize=="<<sizeof(strings[i]) <<"\tlength=="<<strlen(strings[i])<<endl; #endif #ifdef X20 // int a[][4]={{0,1,2,3},{4,5,6,7},{8,9,0,1}}; int (*p)[4]=a; size_t nrows=sizeof(a)/sizeof(a[0]); size_t ncols=sizeof(a[0])/sizeof(a[0][0]); cout<<"sizeof(*p)=="<<sizeof(*p)<<endl; for(int i=0;i<nrows;++i) { for(int j=0;j<ncols;++j) cout<<p[i][j]<<' '; cout<<endl; } #endif #ifdef X21 // int a[][3][4]= { { {0,1,2,3},{4,5,6,7},{8,9,0,1} }, { {2,3,4,5},{6,7,8,9},{0,1,2,3} } }; int (*p)[3][4]=a; size_t ntables=sizeof(a)/sizeof(a[0]); size_t nrows=sizeof(a[0])/sizeof(a[0][0]); size_t ncols=sizeof(a[0][0])/sizeof(a[0][0][0]); cout<<"sizeof(*p)=="<<sizeof(*p)<<endl; cout<<"sizeof(a[0][0])=="<<sizeof(a[0][0])<<endl; for(int i=0;i<ntables;++i) { for(int j=0;j<nrows;++j) { for(int k=0;k<ncols;++k) cout<<p[i][j][k]<<' '; cout<<endl; } cout<<endl; } #endif #ifdef X22 // int (*pFunc)(const char *, ...)=printf; pFunc("函数指针的应用\n"); #endif #ifdef X23 // qsort(argv+1,argc-1,sizeof(argv[0]),comp); while(--argc) cout<<*++argv<<endl; #endif #ifdef X24 // if(argc>=2&&argc<=4) for(int i=0;i<argc;i++) cout<<argv[i]<<endl; else cout<<"输入有误"<<endl; #endif #ifdef X25 // int i; for (i=0; i < argc; i++) printf("Argument %d is %s.\n", i, argv[i]); #endif #ifdef X26 // extern void retrieve(void); extern void insert(void); extern void update(void); extern int show_menu(int c); void (*farray[])(void)={retrieve,insert,update}; // 数组元素是函数名字 for(int choice=0;choice<show_menu(5);++choice) { farray[choice%3](); // choice%3 的可能值为 0、1、2 正好可以把farray数组下标覆盖全 } #endif #ifdef X27 // class C { public: void f(){ cout<<"C::f()\n";} void g(){ cout<<"C::g()\n";} }; C cobject1; void (C::*pCF1)()=&C::f;// 未声明直接使用 (cobject1.*pCF1)(); pCF1=&C::g; (cobject1.*pCF1)(); cout<<"上下两种风格的类成员函数指针"<<endl;// 上下两种风格 void (C::*pCF2)();// 声明类的成员函数指针 C cobject2; pCF2=&C::f; (cobject2.*pCF2)(); pCF2=&C::g; (cobject2.*pCF2)(); #endif #ifdef X28 // int show_menu(int); srand((int)time(NULL)); Object O; for(;;) { int choice=show_menu(rand()%100); if(0<=choice && choice <3) O.process(choice-1); else if(choice==4) break; else cout<<"No numbers contains"<<endl; } #endif #ifdef X29 // #endif #ifdef X3 // #endif return 0; }
headFile.h
#ifndef HEADFILE_H #define HEADFILE_H #include <iostream> #include <cstdio> #include <iomanip> using namespace std; #define X28 void swap(int* xp,int* yp); void* memcpy(void* target,const void* source,size_t n); void inspect(const void* ptr,size_t nbytes); void func(int b[],size_t n); int comp(const void* p1,const void* p2); #endif
headFile.cpp
#include "headFile.h" void swap(int* xp,int* yp) { int temp=*xp; *xp=*yp; *yp=temp; } void* memcpy(void* target,const void* source,size_t n) { char * targetp=(char*)target; const char* sourcep=(const char*)source; while(n--) *targetp++=*sourcep++; return target; } void inspect(const void* ptr,size_t nbytes) { const unsigned char* p=(const unsigned char*)ptr;// 强制转换为const 类型的变量(只为读取不为改写) cout.setf(ios::hex,ios::basefield); for(int i=0;i<nbytes;++i) cout<<"byte"<<setw(2)<<setfill(' ')<<i<<": "<<setw(2)<<setfill('*')<<int(p[i])<<endl; } void func(int b[],size_t n) { cout<<"\n *** Entering function func() *** \n"; cout<<"b=="<<b<<endl; cout<<"sizeof(b)=="<<sizeof(b)<<endl; for(int i=0;i<n;++i) cout<<b[i]<<' '; b[2]=99; cout<<"\n *** Leaveing function() ***\n\n"; } int comp(const void* p1,const void* p2) { const char *ps1=*(const char**)p1; const char *ps2=*(char**)p2; return strcmp(ps1,ps2); } void retrieve(void) { printf("1 retrieve\n"); } void insert(void) { printf("2 insert\n"); } void update(void) { printf("3 update\n"); } int show_menu(int c){int i=c; return i;}
Object.h
#ifndef OBJECT_H
#define OBJECT_H
class Object
{
public:
void retrieve(void) { printf(" Object::retrieve\n"); }
void insert(void) { printf(" Object::insert\n"); }
void update(void) { printf(" Object::update\n"); }
void process(int choice);
private:
typedef void (Object::*Omf)();
static Omf farray[3];
};
Object::Omf Object::farray[3]= { &Object::retrieve,
&Object::insert,
&Object::update
};
void Object::process(int choice)
{
if(0<= choice && choice <=2)
(this->*farray[choice])();
}
#endif
相关文章推荐
- c++中指针与数组
- C/C++学习笔记-数组和指针
- C/C++基础知识(一)数组和指针
- C/C++数组名与指针区别深入探索
- C++指针和数组和动态分配内存
- C++中字符数组和字符指针问题
- C/C++数组名与指针区别深入探索
- C++指针和数组:认识指针和数组
- C++ 中数组的指针和下标
- C/C++数组名与指针区别深入探索
- C/C++ 学习笔记:指针数组 数组指针 指针函数 函数指针
- C++ Primer学习笔记8 数组和指针
- 【C++】利用指针表达式遍历数组
- C/C++数组名与指针区别
- 挑战30天C++入门极限-C/C++中数组和指针类型的关系
- c++中矩阵相乘(对象数组与对象指针的应用)
- C++动态数组,多重指针问题
- C#调用c++Dll 结构体数组指针的问题
- C/C++数组名与指针区别深入探索
- C/C++复习:数组作实参,指针作形参排序