目录
指针就是一个地址。
指针描述了数据在内存中的位置,标示了一个占据存储空间的实体,在这一段空间起始位置的相对距离值。在 C/C++语言中,指针一般被认为是指针变量,指针变量的内容存储的是其指向的对象的首地址,指向的对象可以是变量(指针变量也是变量),数组,函数等占据存储空间的实体。
指针变量是存放一个内存地址的变量,不同于其他类型变量,它是专门用来存放内存地址的,也称为地址变量。定义指针变量的一般形式为:类型说明符*指针变量名。
单指针、双指针、指针数组、数组指针、指针函数、函数指针、字符指针
单指针:可以与变量、一维数组、二维数组、函数进行联系
双指针:可以与变量、指针数组进行联系
字符指针如下代码所示:
a、b、c、d代表的是数组首元素的首地址,其所开辟的空间地址不相同,a、b、c、d代表不同的空间首地址,所以a!=b,a!=c
p1、p2、p3、p4指向字符串常量,存储的是该字符串的首地址,因为其所指向的字符串相同,p1、p2、p3、p4指向的字符串首地址相同,所以p1==p2 ,p3==p4 ,p1==p3
- //字符指针
- void main()
- {
- char a[] = "123";
- char b[] = "123";
- const char c[] = "123";
- const char d[] = "123";
- //a b c d代表的是数组的首地址
- const char *p1 = "123";//所指向内容是const
- const char *p2 = "123";
- const char *const p3 = "123";
- const char *const p4 = "123";
- //p1 p2 p3 p4存放字符串首地址
- if (a == b)
- cout << "a==b" << endl;
- if (a == c)
- cout << "a==c" << endl;
- if (p1 == p2)
- cout << "p1==p2" << endl;
- if (p3 == p4)
- cout << "p3==p4" << endl;
- if (p1 == p3)
- cout << "p1==p3" << endl;
- }
- //输出结果为:p1==p2 p3==p4 p1==p3
首先从最里面的圆括号开始阅读,然后向右看,再往左看。每当遇到圆括号时,就应该调转阅读方向。一旦解析完圆括号里面所有东西,就跳出圆括号。重复整个过程直到整个声明解析完成。其实左右法则就是以标示符为中心点,自右向左旋转解读指针的声明含义。
int (*p)[4]——整型数组指针——指向数组的指针
int *q[4]——整型指针数组——存储指针的数组
int (*p1[5])——整型指针数组
int*(*p2[3])(int)——整型指针函数指针数组
int *p3(int n)——整型指针函数——返回值为指针的函数
int (*p4)(int,int)——整型函数指针——指向函数的指针
函数名:代表函数的入口地址
- int Sum(int a, int b)
- {
- return a + b;
- }
- void main()
- {
- int (*p)(int, int);//函数指针,p是一个指针,指向一个函数,函数有两个int型参数,返回值为int
- p = Sum;
- //cout << Sum(4, 7) << endl;
- cout << p(4, 7) << endl;//等价
- }
- int max(int a, int b)
- {
- return a > b ? a : b;
- }
- void test(int x, int y, int(*p)(int, int))
- {
- cout << p(x, y) << endl;
- }
- void main()
- {
- test(2, 9, max);//将max传给p,相当于p=max
- }
- /*
- * 函数指针函数 fn是个函数名,函数里面有int n的一个参数,fn函数的返回值是个指针,这个指针指向一类函数 int xx(int,int)
- */
- int (*fn(int n))(int, int)//函数指针函数
- {
- cout << "fn n=" << n << endl;
- return min;//返回值是个指向函数的指针,在此可以返回函数名
- }
- void main()
- {
- int (*p)(int, int);//函数指针,p是一个指针,指向一个函数,函数有两个int型参数,返回值为int
-
- cout << "函数指针作为函数返回值" << endl;
- cout << fn(100)(3, 20) << endl;//先调用fn函数,将100传递给参数n,fn函数返回min,再调用min(3,20)
- p = fn(100);//p->min
- cout << p(3, 20) << endl;
- }
- int Sum(int a, int b)
- {
- return a + b;
- }
- int max(int a, int b)
- {
- return a > b ? a : b;
- }
- int min(int a, int b)
- {
- return a < b ? a : b;
- }
- int Sub(int a, int b)
- {
- return a - b;
- }
- int Mul(int a, int b)
- {
- return a * b;
- }
- void main()
- {
- int (*p[])(int, int) = { Sum,max,min,Sub,Mul };//函数指针数组
- int x = 10, y = 20;
- int n = sizeof(p) / sizeof(p[0]);
- for (int i = 0; i < n; i++)
- {
- cout << p[i](x, y) << endl;
- }
- }
1+2+3+4+...+100不能用if,不能用循环,不能用公式,不能直接输出结果
代码思路:
n=100
return pf[!!100](99)+100->return pf[1](99)+100->f1(99)+100;
n=99
return pf[!!99](98)+99->f1(98)+99;
n=98
return pf[!!98](97)+98->f1(97)+98;
.......
return pf[!!0](-1)+0->pf[0](-1)+0->f0(-1)+0->0;
- int f0(int n)
- {
- return 0;
- }
- int f1(int n)
- {
- static int(*pf[2])(int) = { f0,f1 };//pf[0]=fo fp[1]=f1
- return pf[!!n](n - 1) + n;
- }
- void main()
- {
- cout << f1(100) << endl;
- }
n个1~10的数据,例如1 3 2 5 4 7 4 6 3 6 3 ,计算1~10出现的次数
代码思路:
运用桶排序
- void main()
- {
- int num[] = { 1,2,3,4,5,6,7,8,9,1,4,3,2,5,10,2,9 };
- int n = sizeof(num) / sizeof(num[0]);
- int count[11] = { 0 };
- int i;
- for (i = 0; i < n; i++)
- {
- count[num[i]]++;
- }
- for (i = 1; i <= 10; i++)
- cout << i << ":" << count[i] << endl;
- }