寒假C++学习2-二维数组的聚合赋值,字符串处理函数(strcat,strcpy,strcmp,strlen),指针,引用,命令参数

1.二维数组的聚合赋值

#include<bits/stdc++.h>

using namespace std;

int main(){
    //聚合方式赋值
    int a[3][2] = {{1,2},{3,4},{5,6}};
    //只会按照行优先的方式赋值第一行,缺省值为0
    int b[3][2] = {1,2};

    return 0;
}

2.字符串处理函数

1)strcat()函数-字符串连接函数

strcat(字符数组名1,字符数组名2)

作用:将字符数组2连接到字符数组1中字符串的后面,并且删去字符串1后的串结束标志"\0"

#include<bits/stdc++.h>

using namespace std;
const int maxn = 106;

int main(){
    char ch1[maxn],ch2[maxn];
    gets(ch1),gets(ch2);
    strcat(ch1,ch2);
    cout<< ch1 <<endl;

    return 0;
}
//123 456
//78
//123 45678

注意:字符数组1的容量一定要足够装下两者的和,否则无法装下连接后的字符串,但是刚刚试了试,发现好像可以装下去,不懂了qwq

#include<bits/stdc++.h>

using namespace std;

int main(){
    char ch1[3] = {'a','b'};
    char ch2[3] = {'A','B'};
    cout<< ch1 <<endl;
    cout<< ch2 <<endl;
    strcat(ch1,ch2);
    cout<< ch1 <<endl;

    return 0;
}
//ab
//AB
//abAB

2)strcpy()函数-字符串复制函数

strcpy(字符数组1,字符数组2)

作用:将字符数组2中的字符串复制到字符数组1中,包括结束标志"\0"

注意:1.字符数组1有足够长度

2.字符数组1必须是字符数组名,而字符数组2可以是一个字符串常量

#include<bits/stdc++.h>

using namespace std;

int main(){
    char ch1[10];
    strcpy(ch1,"123");
    cout<< ch1 <<endl;

    return 0;
}
//123

3)strcmp()函数-字符串比较函数

strcmp(字符数组名1,字符数组名2)

//按照ASCII码顺序比较
if 1 = 2 return 0
if 1 > 2 return +|x|
if 1 < 2 return -|x|

4)strlen()函数-获取字符串长度(实际长度)

strlen(字符数组名)//不包含字符串结束标志
#include<bits/stdc++.h>

using namespace std;

int main(){
    char ch1[10] = {'1','2'};
    cout<< strlen(ch1) <<endl;

    return 0;
}
//2

3.指针

1)指针的赋值

1.初始化的赋值

int a = 1;
int *p = &a;

2.后期赋值

int a = 1;
p = &a;

2)指针运算符和取地址运算符

1.“ * ”是取值运算符

2.“ & ”是取地址运算符

&*p 和 *&a的区别(p = &a):两者优先级相同,按照自右向左的方向结合

&*p相当于取变量a的地址,而*&a相当于变量a

3)空指针

void *p;

可以接受任何类型的数据,可以强制转换为所对应的数据类型。

4)指向常量的指针与指针常量

int a = 1;
int * const p = &a;
/* 指针常量
 * 指针常量表示这个指针的指向是不可以改变的,但是可以改变它指向内存的内容
*/
int const* p = &a;
/* 指向常量的指针
 * 指针的指向可以改变,但是通过该指针是不能够修改内容的(其它非指向常量的指针可以改变)
*/

5)数组与指针的联系

数组名其实是一个指针常量

通过指针操作数组的等价含义:

*(p--) = a[i--]
*(++p) = a[++i]
*(--p) = a[--i]

ex:利用指针变量遍历二维数组

#include<bits/stdc++.h>

using namespace std;

int main(){
    int a[2][2] = {1,2,3,4};
    int *p;
    p = a[0];
    for(int i = 0;i < sizeof(a)/sizeof(int);i++){
        cout<< "address: " << a[i] << " is " << *p++ <<endl;
    }

    return 0;
}
//address: 0x6dfec8 is 1
//address: 0x6dfed0 is 2
//address: 0x6dfed8 is 3
//address: 0x6dfee0 is 4

二维数组的原理:

#include<bits/stdc++.h>
using namespace std;
int main() {
    int a[3][4];
    int (*b)[4];                    //定义一个数组指针,可以指向一个含有4个整型变量的数组
    int *c[4];                      //定义一个指针数组,储存指针的数组,最多只能储存4个指针
    int *p;
    p = a[0];                      //让p指向数组a的第0行的行地址
    b = a;                       //让b指向数组a
    cout<< "利用连续内存的特点,使用int指针将二维int数组初始化" <<endl;
    {
        for(int i = 0; i<12; i++) {         //初始化二维数组
            *(p+i) = i + 1;            //给第i行首元素赋值
            cout<<a[i/4][i%4]<<",";
            if((i+1)%4 == 0) {          //每4列换行
                cout<<endl;
            }
        }
    }
    cout<<"使用指向数组的指针,二维数组的值改变"<<endl;
    {
        for(int i = 0; i<3; i++) {
            for(int j = 0; j<4; j++) {
                *(*(b+i)+j) += 10;        //通过数组指针修改二维数组内容
            }
        }
    }
    cout<<"使用指针数组,再次输出二维数组"<<endl;
    {
        for(int i= 0; i<3; i++) {
            for(int j = 0; j<4; j++) {
                c[j] = &a[i][j];            //用指针数组里的指针指向a[i][j]
                cout<<*(c[j])<<",";
                if((j+1)%4 == 0) {          //每4列换行
                    cout<<endl;
                }
            }
        }
    }
    return 0;
}

6)指针在函数中的应用-指针函数

指向函数的指针

#include <bits/stdc++.h>
using namespace std;
int avg(int a,int b);
int main() {
    int i,j,ipResult,ifResult;
    i = 10;
    j = 30;

    int (*pFun)(int ,int );//定义函数指针
    pFun = avg;

    ifResult = avg(i,j);
    ipResult = (*pFun)(i,j);

    cout<< ifResult <<endl;
    cout << ipResult <<endl;

    return 0;
}

int avg(int a,int b) {
    return (a + b) / 2;
}

//20
//20

从函数中返回指针

int* function(形式参数表){
    ...;
    return p;
}

7)指针数组

int *p[4];
int *(*p);

4.引用

引用-C++11标准中提出左值引用,不加声明的情况下,引用一般指的就是左值引用

引用实际上是一种隐式指针,形式:

int a = 10;
int &ia = a;//别名
ia = 2;

说明:

1.一个C++引用被初始化后,无法使用它再去引用另一个对象,它不能被重新约束

2.引用变量只是其它对象的别名,对其操作等同于对所引用对象的操作

3.指针变量与引用主要有两点区别:一是指针是一种数据类型,而引用不是一种数据类型,指针可以转换成它所指向变量的数据类型,以便赋值运算符两边的类型匹配,而在使用引用的时候,系统要求引用和变量的数据类型必须相同,不能进行数据类型的转换。二是指针变量的语法更为复杂一些,而定义引用变量之后,使用方法与普通变量一样。

4.引用必须初始化,否则会报错

·命令参数

main(int argc,char *argv[])

main()函数中的参数可以获取程序运行的命令参数,命令参数就是执行应用程序时后面带的参数,例如cmd控制台中的dir /w,/w参数就是以多列的形式显示出文件夹内的文件名,main()中的参数argc是获取命令参数的个数,argv是字符指针数组,可以获取具体的命令参数

#include<iostream>
using namespace std;
int main(int argc,char *argv[]){
    cout << "the list of parameter:" << endl;
    while(argc>1){
        ++argv;
        cout << *argv << endl;
        --argc;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/guifei0/article/details/86645817