1. const修饰指针

(1)常量指针

    //const修饰指针,const后面跟*
    int a=10;
    const int *p=&a;
    
    //指针指向的值不可以修改,指针的指向可以修改
    *p=20;//错误
    p=&b;//正确

(2)指针常量

    //const修饰常量,const后面跟常量
    int a=10;
    int * const p;
	
    //指针指向的值可以该,指针的指向不可以改
    *p=20;//正确
    p=&b;//错误

(3)常量指针常量

    //const既修饰指针,又修饰常量
    //指针指向的值和指向都不可以改
    const int * const p=&a;

2. 指针访问数组

    int arr[4]={1,2,3,4};
    int *p=arr;
    
    cout<<*p<<endl;//1
    p++;
    cout<<*p<<endl;//2

3. 指针和函数

int a=10;
int b=20;
//(1)值传递
void swap(int a,int b){
	int temp=a;
    b=a;
    a=temp;
}
swap(a,b);
cout<<a<<' '<<b<<endl;
//10 20
//a和b的值并没有被改变

//(2)地址传递
void swap(int *a,int *b){
	int temp=*a;
    *b=*a;
    *a=temp;
}
swap(&a,&b);
cout<<a<<' '<<b<<endl;
//20 10
//a和b的值被改变了,地址传递可以改变实参

4. 指针、函数和数组的结合

    //对数组进行冒泡排序
    void bubbleSort(int *arr,int len){//注意加*
    	for(int i=0;i<len;i++){
        	for(int j=0;j<len-i-1;j++){
            	if(arr[j]>arr[i+1]) {
                	int temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
        }
    }
    
    int main(){
    	int arr[10]={1,4,6,2,8,9,3,7,5,0};
        bubbleSort(arr,10);//arr就是数组的地址,相当于指针
    }

5. 结构体

	//定义一个结构体
    struct Student{
    	String name;
        int age;
    }
    
    //使用结构体
    //1.
    struct Student s1;
    s1.name="zerlina";
    s1.age=18;
    
    //2. 创建的同时赋初值
    struct Student s2={"zerlina",18};
    
    //3.定义结构体的时候创建结构体变量
    struct people{
    ...
    }s3;
    s3.name="xxx";
    s3.age=18;
    
    //4. 
    Student s4;//创建的时候struct关键字可以省略
    

6. 结构体数组

	//定义一个结构体
    struct Student{
    	String name;
        int age;
    }
    
    Student subArray[2]={
    	{"aa",20},
        {"bb",30}
    };
    //chang value
    subArray[1].name="cc";

7. 结构体指针

	//定义一个结构体
    struct Student{
    	String name;
        int age;
    }
    Student s1={"aa",12};
    Student *p=&s1;
    string name=p->name;
    int age=p->age;

8. 结构体做函数参数

	//1.值传递
    void fun1(struct student s){
    	cout<<s.name<<endl;
    }
    fun1(s);
    
    //2. 地址传递
    void fun2(struct student *s){
    	s->name="bb";//地址传递可以改数据
    	cout<<s->name<<endl;
    }
    fun2(&s);

9. const修饰结构体数据

在上面的值传递中,每次函数体内部都会复制一个副本来存放传进去的student结构体,为了节省空间我们可以传入指针,即使用地址传递,但地址传递有值被修改的隐患,为了保证数据不被修改,加入const。

	struct student{
      string name;
      int age;
    }
    
    void fun(const student *s){
    	cout<<s->name;
        //s->name=200;会报错
    }
    int main(){
    	student s={"aa",12};
        fun(&s);
    }