c++知识点总结

来源:互联网 发布:淘宝上怎么卖话费充值 编辑:程序博客网 时间:2024/06/14 04:33

using namespace std

所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。

由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:[1] 
直接指定标识符
例如std::iostream而不是iostream。完整语句如下:
1
std::cout<<std::hex<<3.4<<std::endl;
:<<是插入运算符,将字符串插入到输出流(输出队列cout)中
使用using关键字
加入using std::cout; using std::endl; using std::cin; 则前面语句可以写成如下代码:
1
cout << hex << 3.4 << endl;
使用using namespace std
这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。例如:
1
2
3
4
#include<iostream>
#include<sstream>
#include<string>
using namespace std;

1
cout << hex << 3.4 << endl;


输入和输出

  

#include <iostream><span style="white-space:pre"></span><span class="s1" style="font-family: Arial, Helvetica, sans-serif;">//</span><span class="s2" style="font-family: Arial, Helvetica, sans-serif;">预处理命令</span><span style="white-space:pre"></span>using namespace std;    //使用命名空间stdint main(int argc, const char * argv[]) {   //程序主函数    // insert code here...       int a,b,sum;    cin >> a >> b;      //输入,>>为提取运算符,从输入设备中提取数据送到输入流cin中    sum = a+b;    cout<<a<<"+"<<b<<"="<<sum<<endl;    //输出,<<插入运算符,将数据插入到输出流(输出队列cout)中,endl作用为换行即"\n"        return 0;   //程序结束,向操作系统返回0}

c语言的输入和输出

为了兼容,c++保留了c语言的这一用法,必须指定数据的类型和格式

    int a;float b;char c;    scanf("%d %f %c",&a,&b,&c);//输入,注意在变量名前要加地址运算符&    printf("a = %d,b=%f,c=%c\n",a,b,c);//输出

运算符的优先级

逻辑运算符包括:&&逻辑与,||逻辑或,!逻辑非

高低排序为:! > 算数运算符(+,-,*,/) > 关系运算符(<,>=,==,!=) > &&和|| > 赋值运算符(=)



数值范围

c++没有统一规定各类数据的精度,数值范围和内存中所占的字节数。以下为visual c++数值型和字节型数据。



转义字符


字符串与字符

“a”和'a'所代表的含义是不同的,“a”是字符串常量,‘a’是字符常量,前者占两个字节,后者站一个字节。char类型的数据只能存放‘a’。

一个字符串的结束标志为 ‘ \0 ’,‘\0’代表ASCII码为0的字符。

用一个字符数组可以存放一个字符串的字符。例如:char str[10] = "china"

字符串的初始化方式

字符数组存放字符串: char str[30] = "abcde";

字符串变量存放字符串:string str = "abcde";

字符指针指向字符串:char *str = "abcde";//把字符串第一个元素的地址赋给str


字符串处理相关的常见函数

字符串连接函数strcat

 char *strcat(char[ ], const char [ ]);

将两个字符数组中的字符连接到前面字符数组的字符串后面。第二个字符数组被指定为const,以保证该数组的内容不会在函数调用期间修改。

<span style="font-size:14px;">  char   str1[30] = "I am a ";    char str2[30] = "superman";    cout << strcat(str1, str2);</span>

字符串复制函数 strcpy

 char *strcpy(char[ ], const char [ ]);


字符串比较函数 strcmp

char *strcmp(char[ ], const char [ ]);

相等时返回0;1大于2时返回正整数;1小于2时返回负整数


字符串长度函数 strlen

char *strlen(const char[ ]);


指针

指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。一个变量的地址称为该变量的指针。

运算符&和*

&是取地址运算符,*是...书上叫做“间接运算符”,表示指向。&a的运算结果是一个指针,指针的类型是a的类型加个*,指针所指向的类型是a的类型,指针所指向的地址嘛,那就是a的地址。

*p的结果是p所指向的东西,这个东西有这些特点:它的类型是p指向的类型,它所占用的地址是p所指向的地址。

int a=12;  int b;  int *p;  int **ptr;  p=&a;//&a的结果是一个指针,类型是int*,指向的类型是int,指向的地址是a的地址。  *p=24;//*p的结果,在这里它的类型是int,它所占用的地址是p所指向的地址,显然,*p就是变量a。ptr=&p;//&p的结果是个指针,该指针的类型是p的类型加个*,在这里是int**。该指针所指向的类型是p的类型,这里是int*。该指针所指向的地址就是指针p自己的地址。 *ptr=&b;//*ptr是个指针,&b的结果也是个指针,且这两个指针的类型和所指向的类型是一样的,所以?amp;b来给*ptr赋值就是毫无问题的了。**ptr=34;//*ptr的结果是ptr所指向的东西,在这里是一个指针,对这个指针再做一次*运算,结果就是一个int类型的变量。

打印指针和地址

    int a,b;    int *point_a, *point_b;    a = 100; b = 10;    point_a = &a;    point_b = &b;    cout << * point_a << "和" << * point_a << "为:" << point_a << "和" << point_a << endl;
打印结果为:

100100为:0x7fff5fbff78c0x7fff5fbff78c


指向指针的指针

int * * ppi;    //

这是一个指向指针的指针,注意有两个

*

int * * ipp;    //这是一个指向指针的指针,注意有两个*号


1
2
inti = 5, j = 6, k = 7;
int*ip1 = &i, *ip2 = &j;

现在我们可以这么写:

1
int**ipp = &ip1;

那么现在指针 ipp 指向了 ip1,ip1 指向了 i。*ipp 就是 ip1,**ipp 就是 i,或者说是 5。我们可以用我们熟悉的盒子箭头图来描述,像这样:

a8MUU

 int i = 5, j = 6, k = 7;    int *ip1 = &i, *ip2 = &j;    int **ipp = &ip1;    cout << ipp << endl;    //指针的地址    cout << *ipp << endl;   //指针指向的地址,即指针的内容    cout << **ipp << endl;  //指针指向的内容,即地址所在的内容
结果为:

0x7fff5fbff758

0x7fff5fbff76c

5


如果我们接着这么写:
1
*ipp = ip2;

我们就改变了 ipp 指向的那个指针(也就是 ip1),现在它指向 ip2 所指的地方。也就是说(ip1)现在它指向了 j:

bpfxT

我的疑问是:为什么在第二幅图里,ipp 还是指向 ip1 而不是 ip2?

最佳答案:

让我们暂时忘掉那些关于指针的各种类比。指针实际上存放的是内存的地址。

& 符号的意思是取地址,也就是返回一个对象在内存中的地址。

* 符号的意思是取得一个指针所指向的对象。 也就是如果一个指针保存着一个内存地址,那么它就返回在那个地址的对象。

所以当你这么写时 *ipp = ip2,实际上是把 ipp 存的地址所对应的对象,也就是 ip1 取到,然后把 ip2 存的值赋值给 ip1,也就是 j 的地址。

简单点就是:
&:取址。
* :取值。


指针与数组
   char * * p;    char *name[] = {"java","OC","swift","c++"}; //数组默认指向第一个数据    p = name+2;         //修改p的指向为第三个数据     cout << p << endl; //数组所指向内容的地址    cout << *p << endl; //数组所指向的内容    cout << **p << endl;//数组所指向内容的首个字符
结果为:

0x7fff5fbff790

swift

s


const限定符

const int bufSize = 512; 

定义 bufSize 为常量并初始化为 512。变量 bufSize 仍然是一个左值,但是现在这个左值是不可修改的。任何修改 bufSize 的尝试都会导致编译错误:

bufSize = 0; // error: attempt to write to const object因为常量在定义后就不能被修改,所以定义时必须初始化:

85

const std::string hi = "hello!"; // ok: initialized      const int i, j = 0;  // error: i is uninitialized const

与其他变量不同,除非特别说明,在全局作用域声明的 const 变量是定义该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问。

通过指定 const 变更为 extern,就可以在整个程序中访问 const 对象:

// file_1.cc
// defines and initializes a const that is accessible to other filesextern const int bufSize = fcn();
// file_2.cc
extern const int bufSize; // uses bufSize from file_1
// uses bufSize defined in file_1
for (int index = 0; index != bufSize; ++index)

// ... 









1 0
原创粉丝点击