1.
char*与char[]区别:
char* s1=”abc”;s1是一个指针,s1所指向的地址的内容是不可改变的,但是s1可以指向其他地址。s1是指向字符串常量的,它存储在里不可被修改
char* s1="abcd";
s1[2]='z'; //错误:编译时能通过运行的时候会报错
s1="xyz"; //可以将指针指向其他内容
cout<
char s2[] =”cdef”;是一个数组,s2指向第一个元素所在的位置,一经分配就不能更改。 它的空间是则栈里分配的,可以被重新修改,但是s2不能够再指向其他空间
char s2[]="efgh";
s2="xyz"; //出错:s2不可以再指向其他内容
cout<
若是将指针指向一个数组,那么这个数组即可以被改变元素值又可以被指向其他字符串
char *p=s2;
p[0]='x'; //可以改变元素值
p="rty"; //可以指向其他字符串
cout<
char *与char a[] 的本质区别:
1)当定义char a[10]时,编译器会给数组分配十个单元,每个单元的数据类型为字符,sizeof(a) = 10
2)而定义char *s 时,这是给指针变量,只占四个字节,32位,用来保存一个地址。sizeof(s) = 4
printf("%p", s); // 这个表示s的单元中所保存的地址
printf("%p", &s); // 这个表示变量本身所在内存单元地址,不要搞混了
注:
(1).
char *s1:s1是一个指向字符串的指针;
char s2[]:s2是一个字符数组;
string s3:s3是一个string类的对象.
(2).
string和CString是类,有特定的构造函数和一些方法方便你操作字符串。而char是一种度原始数据类型,可以是一个字符也可回以是字符数组像char[] 、char*,它不是类,所以只能借助现成的libc中的函数来操作它,比如strcpy strcmp strlen等。
(3).
char (*s)[i]与char *s[i]区别:
char (*s)[i]; //s是个指针,它指向长度是i的一维数组,可以用第二维长度是i的二维数组的地址初始化它;
char *s[i]; //s是个数组,它的元素是指向字符类型的指针char* .
(4). 取char a[20] ,char *s ,当s=a ,则s[i] == a[i]
例:
#include
using namespace std;
int count_last(char* str)
{
int count = 0;
if(str == NULL)
return 0;
int i = 0;
while(str[i] != '\0') // \0是组的结束字符标志
i++;
int length = i;
while(str[i-1] != ' ' && (i >= 1)) //从尾向前
i--;
count = length - i;
return count;
}
int main()
{
char str[5000];
int count = 0;
cin.getline(str, 5000);
count = count_last(str);
cout << count;
return 0;
}
2.
例
#include
using namespace std;
#include
int Chazhao(string str, char ch)
{
int N = 0;
if(ch >= 'A' && ch <= 'Z')
ch = ch +32;
for(int i = 0; i < str.length(); i++)
{
if(str[i] >= 'A' && str[i] <= 'Z')
str[i] = str[i] + 32;
if(str[i] == ch)
N++;
else
continue;
}
return N;
}
int main()
{
string ip;
char zifu;
getline(cin, ip);//输入字符串
zifu = getchar();//输入字符
int N = Chazhao(ip, zifu);
cout << N << endl;
return 0;
}
3.
vector向量:是一个能够存放任意类型的动态数组
介绍 https://blog.csdn.net/guoyiyan1987/article/details/80325782
例:
#include
using namespace std;
#include
#include
vector OperateInput(int size, vector arr)
{
vector res;
for(int i = 0; i < size; i++)
{
int temp = arr[i];
for(int j = i + 1; j < size; j++)
{
if(temp == arr[j])
arr[j] = -1;//重复元素作标记-1
}
}
for(int i = 0; i < size; i++)
if(arr[i] != -1)
res.push_back(arr[i]);
sort(res.begin(), res.end());
return res;
}
int main()
{
int size;//个数
while(cin >> size)
{
vector arr;//动态数组
int temp;
for(int i = 0; i < size; i++)
{
cin >> temp;
arr.push_back(temp);
}
vector result = OperateInput(size, arr);
for(int j = 0; j
4.
#include
#include
using namespace std;
int main()
{
string s1, s2;
while(getline(cin, s1))
{
getline(cin, s2);//连续输入2个字符串
if(s1.empty() == 0)//非空
{
if(s1.size()%8 != 0)
s1.insert(s1.size(), 8 - s1.size()%8, '0');//在尾部补足够的0
for(int i = 0; i < s1.size(); i += 8)
cout << s1.substr(i, 8) <
5.
#include
using namespace std;
int main()
{
long num;
cin >> num;
while(num != 1)
{
for(int i = 2; i <= num; i++) //不能是i
6.
C++中常用的两种创建动态数组方法:new()和vector.
vector是c++标准库中定义的类型,是容器的一种。标准库中容器有很知多种,vector只是最基本的一种,vector类型和数组类型的道基本功能都是一样的,就是存储同类元素,但是他与数组最大的区别就是可以实现动态存储。而new是关键字,用于动态分配内存,分配的是栈空间,要用delete来释放,否则会出现内存泄露。二者说不上什么区别,不是一样的东西。vector是一种类型,定义该容器类型用到了new。
https://blog.csdn.net/cuiy0818/article/details/81503172
例
#include
using namespace std;
int main()
{
int num;//键值对数
cin >> num;
int count = num;
int* index = new int[num];//键 数组
int* value = new int[num];//值 数组
for(int i = 0; i < num; i++)
cin >> index[i] >> value[i];
int j = 0;
while(j < num - 1)
{
if(index[j] < num)
{
for(int i = j + 1; i < num; i++)
{
if(index[i] == index[j])
{
value[j] += value[i];
index[i] = num;
count--;
}
}
}
j++;
}
int min, temp;
for(int i = 0; i < num - 1; i++)
{
min = i;
for(int m = i+1; m < num; m++)
if(index[min] > index[m])
min = m;
if(min != i)
{
temp = index[min];
index[min] = index[i];
index[i] = temp;
temp = value[min];
value[min] = value[i];
value[i] = temp;
}
}
for(int i = 0; i < count; i++)
cout << index[i] << ' ' << value[i] << endl;
delete [] index;
delete [] value;
return 0;
}
7.
vector容器find()、erase()、unique()、insert():
unique”删除“不是真正的删除,即不像erase那样把元素删除,而是把元素移到下标最末端,要注意unique返回给的迭代器是指向非重复元素的下一个地址,即重复元素的首地址。(使用unique函数一般先对容器的值排序)
https://blog.csdn.net/clz16251102113/article/details/81138137
sort(vec.begin(),vec.end());
vec.erase(unique(vec.begin(),vec.end()),vec.end());
例
#include
#include
using namespace std;
#include
#include
int main()
{
string str;
vector vec;
while(cin >> str)
{
for(int i = 0; i < str.size(); i++)
{
if(str[i]>=0 && str[i]<=127)
vec.push_back(str[i]);
}
sort(vec.begin(), vec.end());//排序
vec.erase(unique(vec.begin(), vec.end()), vec.end());//去重
cout << vec.size() << endl;
}
return 0;
}
8.
字符串输入时,cin与getline()区别:
cin在接受字符串时,遇“空格”、“TAB”、“回车”都结束,getline()就没有这问题。
https://www.cnblogs.com/renzhuang/articles/6993689.html
例1
例2
9.
例
#include
using namespace std;
#include
#include
int main()
{
string s;
stack ss;//取该栈以单词为元素单位
while(cin >> s)//因为各词之间需要用空格来间隔开,所以此处不能用getline()
ss.push(s);//入栈
while(!ss.empty())
{
cout << ss.top();
cout << ' ';
ss.pop();
}
return 0;
}
10.
C++ 中的&:“&引用” 和“&取地址符”的区别和作用
引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。
https://blog.csdn.net/qq_33266987/article/details/52047473?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1
注意以下例子用和不用’&引用‘的区别:
int function(int i){
i++
return i;
}
int functionReference(int &i){
i++;
return i;
}
int x = 5;
function(x); //返回值:6, x :5
functionReference(x); //返回值:6, x :6
例
#include
#include
using namespace std;
#include
bool Compare(string &s1, string &s2)//&引用
{
return s1 < s2;
}
int main()
{
int n;
vector res;
while(cin >> n)
{
while(n != 0)
{
n--;
string m;
cin >> m;
res.push_back(m);
}
sort(res.begin(), res.end(), Compare);
for(int i = 0; i < res.size(); i++)
cout << res[i] << endl;
}
return 0;
}
11.
普通变量、引用变量和指针变量作函数形参的区别:
三者都是传值。普通变量时,不影响实参;引用变量时,可修改实参值;指针变量时,不影响指针本身,但通过指针可影响其指向的变量的值。所以,在C++中常用引用做形参,当不需要实参进行改变的时候在引用前加上“const”进行限制就可以了。