引用很容易与指针混淆,它们之间有三个主要的不同:
1.不存在空引用。引用必须连接到一块合法的内存。
2.一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
3.引用必须在创建时被初始化。指针可以在任何时间被初始化。
注意:引用传递可以改变值,通过引用或地址传递参数,使传递的参数在调用函数中被改变。
void swap(int* a, int* b){
int temp = *a;
*a = *b;
*b = temp;
}//这里需要注意了,不是直接交换指针地址,而是交换地址里面的值
int s = 5;
int& sPointor = s;
void swap2(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
int a = 3;
int b = 4;
// swap(&a,&b);
swap2(a,b);
cout << "a = " << a << ";b = " << + b << endl;
最终结果都是:a = 4;b = 3
const修饰指针
1.通过指针修改const修饰的常量
const int a = 10;
int *p += &a;
*p = 100;a =100;
可以通过1级指针修改一个常量的值
2.const修饰指针类型 int * 不能改变指针变量指向的内存地址的值 但是可以改变指针指向的地址
const int *p = &a
p=&b*p = 100
可以改变指针指向的地址
3.const修饰指针变量 能改变指针指向地址的值,但不能改变指针指向的地址
int * const p = &a;
*p = 100; p=&b
可以修改指针指向地址的值
4.const修饰指针类型修饰指针变量 不能改变指针指向的的值 也不能改变指针指向的地址
const int * const *p = &a;*p =100;
p = &b;
可以通过二级指针进行修改
撸一段C语言的冒泡排序:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
extern void sort(int* p, int length);
int main()
{
int arr[] = { 4,3,6,2,7,8,1 };
int* p = arr;
int length = sizeof(arr) / sizeof(int);
printf("len = %d\n", length);
for (int i = 0; i < length; i++)
{
printf("%d ", *(p + i));
}
printf("\n");
sort(p, sizeof(arr) / sizeof(int));
for (int i = 0; i < length; i++)
{
printf("%d ", *(p + i));
}
return EXIT_SUCCESS;
}
void sort(int* p, int length)
{
for (int i = 0; i < length - 1; i++)
{
for (int j = 0; j < length - 1 - i; j++)
{
if (*(p + j) > * (p + j + 1))
{
int temp = *(p + j);
*(p + j) = *(p + j + 1);
*(p + j + 1) = temp;
}
}
}
}