关于指针和引用基础看C++基础入门C++核心编程

  1. int a = 4;
  2. cout << &a << endl;
  3. cout << *(&a) << endl; //& :取址符,可以获取变量的内存地址, * :解引用 ,表示地址里面的值
  4. *(&a) = 5;
  5. cout << a << endl;

名词解释:

指针:一个地址.知道了一个地址就知道了一个方向,相当于一个指向这个方向的指针
指针变量:一个存放地址的变量

指针与一维数组的关系

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int a[5] = { 1,2,3,4,5 };
  6. cout << a << " " << &a[0] << endl;//都表示第一个元素的地址
  7. int* p = &a[0];
  8. cout << p << " " << p + 2 << " " << &a[0] << " " << &a[2] << endl;
  9. cout << a << " " << a + 1 << " " << a + 2 << " " << a + 3 << " " << a + 4 << endl;
  10. cout << *a << " " << *(a + 1) << " " << *(a + 2) << " " << *(a + 3) << " " << *(a + 4) << endl;
  11. cout << &a << " " << &a + 1 << endl;
  12. int(*p2)[5] = &a; //p2是数组的指针,指向一个含有5个int型元素的数组的指针
  13. cout << p2 << endl;
  14. return 0;
  15. }

指针 - 图1
数组名a,表示数组的起始地址,作为指针指向的对象是数组的元素,+1,就向后偏移一个所指向对象的长度
要想搞清楚指针要知道:1.它的值 2.它所指向的对象

练习:颠倒数组存放顺序

题目:利用指针,将数组a中的整数按相反的顺序存放。
样例输入:
1 3 2 4 6 5
5 6 4 2 3 1
q p
样例输出:
5 6 4 2 3 1

  1. #include <iostream>
  2. using namespace std;
  3. void Swap(int *a,int n)
  4. {
  5. for(int *p = a, *q = a + n - 1; p < q; p++, q--)
  6. {
  7. swap(*p, *q);
  8. }
  9. }
  10. int main()
  11. {
  12. int a[6] = { 1,3,2,4,6,5 };
  13. Swap(a, 6);
  14. for (int i = 0; i < 6; i++)
  15. cout << a[i] << " ";
  16. return 0;
  17. }

二维数组与指针的关系

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int a[4][5] = { {11,12,13,14,15},
  6. {21,22,23,24,25},
  7. {31,32,33,34,35},
  8. {41,42,43,44,45} };
  9. cout << a << " " << &a[0][0] << " " << a+1 << endl; //行指针
  10. int(*p)[5] = a;
  11. cout << *a << " " << *p <<" "<<*a+1<<" "<<*p+1<< endl;//列指针
  12. cout << **a << " " << **p << " " << *(*a + 1) << " " << *(*p + 1) << endl; //元素值
  13. cout << &(*a) << " " << &(*a)+1 << endl; //列指针变成行指针
  14. return 0;
  15. }

二维数组的数组名是一个地址,是数组的起始地址,最为指针指向该数组的第一行,+1,指向下一行.所以是一个行指针,对它加个*,则指向第一行的第一列,则由行指针变成列指针, +1,则指向第一行的下一列,
列指针前面加&则变成行指针

指针与字符串的关系

1).用英文双引号括起来的任意字符序列
例:”boy”

注意:
字符串常量是存储在数据区里的常量区,所以它的值不能被改变,体现常量特性,本身代表地址,它在常量区中的存储地址,作为指针是一个指向它第一个字符的指针

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. //char a[]="abcdedf";
  6. //a[0] = 'x';
  7. //cout << a << endl;
  8. //
  9. const char* p = "abcd";
  10. //
  11. *p = 'x';
  12. cout << p << endl;
  13. while(*p)
  14. {
  15. cout << *p << endl;
  16. p++;//p=p+1
  17. }
  18. return 0;
  19. }

练习:利用指针将一个字符串逆序输出

样例输入:
advbf
样例输出:
fbvda

  1. #include <iostream>
  2. using namespace std;
  3. void Reverse(char *str)
  4. {
  5. if (*str == '\0')
  6. return;
  7. Reverse(str + 1);//递归的原理,因为输出的数据从a到k一直堆积没有释放,最后达到条件释放的时候就从k开始释放,导致结果顺序是反过来的
  8. cout << *str;
  9. }
  10. int main()
  11. {
  12. char str[] = "asdfghjk";
  13. Reverse(str);
  14. return 0;
  15. }

指针与函数的关系

指针函数:返回指针的函数

函数指针:指向函数的指针

指向函数起始地址的指针
函数指针定义:
函数返回类型名(指针变量名)(函数形参类型列表);
`int (
a)(int,int)<br />**函数指针的使用**<br />指针变量名 = 被指向的函数名;a = funca = &func;<br />函数调用:指针变量名(函数调用时的实际参数);a (10,20)(a) (10,20)`
*例如

  1. #include <iostream>
  2. using namespace std;
  3. void func1()
  4. {
  5. cout << "void func1 called!" << endl;
  6. }
  7. int func2(int a)
  8. {
  9. cout << "int func2(int a) called a=" << a << endl;
  10. return a;
  11. }
  12. int main()
  13. {
  14. //定义一个指针,指向没有返回值,没有参数的函数的指针
  15. void (*p1)();
  16. //指向func1;
  17. //p1 = &func1;
  18. p1 = func1;
  19. //通过指针调用函数
  20. // (*p1)();
  21. // p1();
  22. //定义一个指针p2,指向返回值类型为int,有一个int形参的函数
  23. int (*p2)(int);
  24. //p2指向func2
  25. //p2 = func2;
  26. p2 = &func2;
  27. //通过指针调用函数
  28. // p2(10);
  29. (*p2)(10);
  30. return 0;
  31. }
  1. #include <iostream>
  2. using namespace std;
  3. void func1()
  4. {
  5. cout << "void func1 called!" << endl;
  6. }
  7. void func2()
  8. {
  9. cout << "void func2 called!" << endl;
  10. }
  11. void func3()
  12. {
  13. cout << "void func2 called!" << endl;
  14. }
  15. int main()
  16. {
  17. // int a[3];
  18. // int(*a)[3];
  19. void (*a[3])()={func1,func2,func3};
  20. void(*(*p)[3])() = &a; //p是一个指向含有3个元素,每个元素都是指向一个没有返回值没有形参的函数的数组的指针
  21. (**p)();
  22. (*(*p + 1))();
  23. return 0;
  24. }

练习:破解密码

主任交给小樱一项任务,解密抗战时期被加密过的一些伤员的名单。
经过研究,小英发现了如下加密规律(括号中是一个“原文 -> 密文”的例子)

  1. 原文中所有的字符都在字母表中被循环左移了三个位置(dec -> abz)
  2. 逆序存储(abcd -> dcba )
  3. 大小写反转(abXY -> ABxy)

【输入】
一个加密的字符串。(长度小于50且只包含大小写字母)
【输出】
输出解密后的字符串。
【输入样例】
GSOOWFASOq
【输出样例】
Trvdizrrvj

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. char s[100]={'\0'};
  6. cin >> s;
  7. for(int i=0;i<strlen(s);i++)
  8. {
  9. if (s[i] + 3 > 'z')
  10. {
  11. s[i] = (s[i] + 3) % 122 + 96 - 32;
  12. }
  13. else if (s[i] + 3 > 'Z' && s[i] < 'a')
  14. s[i] = (s[i] + 3) % 90 + 64 + 32;
  15. else
  16. {
  17. if (s[i] > 'a')
  18. s[i] = s[i] + 3 - 32;
  19. else
  20. s[i] = s[i] + 3 + 32;
  21. }
  22. }
  23. for (int i = strlen(s) - 1; i >= 0; i--)
  24. cout << s[i];
  25. return 0;
  26. }