const与指针

const在C和C++中的区别

int main()
​
{
​
const int n = 10;//C语言中以变量为主。
​
int ar[n] ={1,2};// error;
​
int*p=(int*)&n;//
​
*p = 100;
​
printf("%n = %d *p=%d n",n,*p);
​
return 0;
​
}
​
int main()
​
{
​
Const int n = 10;// C++ 语言中以常量为主。
​
int ar[n] = {1,2,3,4};// ok;
​
int *p =(int *)&;
​
*p= 100;
​
cout<<"n ="<<n<<" *p="<<*p<<end1;
​
return 0;
​
}

const与指针的关系

int main()
​
{
​
int a = 10,b= 10;
​
int *p1 = &a;// 普通指针
​
const int *p2 = &a;//指向为常性(解引用为常性)
​
int const*p2 = &a;
​
int * const p3 = &a;// 指针变量自身为常性
​
const int* const p4 = &a;//指向(解引用)和指针变量自身都为常性:
​
}
​
int main()
​
{
​
int a = 0;
​
int *p1 = &a;// ok;
​
const int *p2 = &a;// ok;
​
int* const p3 = &a;// ok;
​
const int* const p4=&a;// ok;
​
return 0;
​
}
​
//编译方式不同
常变量和指针

int main()
​
{
​
const int a = 10;
​
int *p1 =&a;// error;
​
const int *p2 = &a;// ok;
​
int * const p3 = &a;// error;
​
const int* const *p4 = &a;// ok;
​
int *p5 =(int*)&a;// ok 不安全
​
return 0;
​
}

同类型指针的赋值兼容规程

int main()
​
{
int a=10,b=20;
int *p=&a;
int *s1=p;
const int *s2=p;
int *const s3=p;
const int *const s4=p;
}

总结:能力强的指针赋值给能力弱的指针

4.引用

引用定义:类型&引用变量名称=变量名称;

&与类型结合称之为引用符号,不是取地址符,代表别名

int main()
​
{
int a=10;
int b=a;//变量
int &c=a;//引用
return 0;
}

引用特点

int main()
​
{
int a=10;
int &x;//error 定义引用必须初始化
int &y=NULL;//error没有空引用
int &b=a;
int &C=b;//error //没有引用的引用、所谓的二级引用
​
}

const引用

int main()
​
{
int a=10;
const int b=20;
int &x=b;
const int &x=b;
const int &y=a;
const int &z=10;
return 0;
}
//为了安全
const int &x=b;
const int &z=10;

引用作为形参替代指针

使用指针交换两个整型值

void my_swap(int *ap,int *bp)
​
{
​
assert(ap != NULL & bp != NULL);
​
int tmp = *ap;
​
*ap = *bp;*
​
bp = tmp;
​
}
​
int main()
​
{
​
int a = 10,b = 20;
​
Cout<<"a ="<<a<<"b="<<b<<endl;
​
my_swap(&a,&b);
​
Cout<<"a ="<<a<<"b="<<b<<end1;
​
return 0;
​
}

使用引用交换两个整型值

void my_swap(int &x,int &y)//不存在NULL引用,不需要判空 ,比指针安全:
​
{
​
int tmp = x;
​
×= y;
​
y = tmp;
​
}
​
int main()
​
{
​
int a= 10,b = 20;
​
cout<<"a ="<<a<<"b="<<b<<end1;
​
my_Swap(a,b);
​
cout<<"a = "<<a<<" b ="<<b<<endl;
​
return 0;
​
}

指针与引用有什么区别?

从语法规则上讲,指针变量存储某个实例 (变量或对象)的地址;引用是某个实例的别名。

程序为指针变量分配内存区域;而不为引用分配内存区域。

解引用是指针使用时要在前加"*";引用可以直接使用。

指针变量的值可以发生改变,存储不同实例的地址;引用在定义时就被初始化,之后无法改变(不能是其他实例的引用)。

指针变量的值可以为空(NULL,nullptr);没有空引用。

指针变量作为形参时需要测试它的合法性(判空NULL);引用不需要判空;

对指针变量使用"sizeof"得到的是指针变量的大小。对引用变量使用"sizeof"得到的是变量的大小。

理论上指针的级数没有限制;但引用只有一级。即不存在引用的引用,但可以有指针的指针。

++引用与++指针的效果不一样。例如就++操作而言,

对指针变量的操作,会使指针变量指向下一个实体(变量或对象)的地址;而不是改变所指实体(变量或对象)的内容。

对引用的操作直接反应到所引用的实体(变量或对象)。

不可以对函数中的局部变量或对象以引用或指针方式返回。

int * func_1()
​
{
int a=10;
return &a;
}
int &func_2()
{
int a=10;
return a;
}

从汇编层次理解引用与指针变量的区别

int  main()
​
{
int a=10;
int *ip=&a;
int& b=a;
*ip=100;
b=200;
return 0;
}

//汇编

 

分析效率

struct Student
​
{
​
char s_id[20];
​
char s_name[20];
​
char s_sex[8];
​
int s_age; 
​
};
​
void funa(struct Student sx)
​
{
​
}
​
void  funb(struct Student *ps)
​
{
}
​
void func(struct Student& st)
​
{
​
}
​
int main()
​
{
​
struct Student s1={};
​
funa(s1);
​
funb(&s1);
​
func(s1);
​
return 0;
​
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值