面试篇之~ c++ 基础知识简单总结 (一)

常量指针,指向一个常量的指针,指向一个常量的常量指针


<p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Menlo; color: rgb(194, 52, 155);"><pre name="code" class="objc">const int a = 1;
    /*两张写法相等*/
    //指向一个常量的指针
    const int  * p = &a; //指向一个常量的指针, 指针可以修改
    int const *p1 = &a; //指向一个常量的指针,指针可以修改
    
    //常量指针
    int b = 2;
    int *const p2 = &b;//指针的内存地址不能改变,但指向的对象值可以改变
    b++;
    //p2++; //wrong
    
    //指向一个常量的常量指针
    const int *const p3 = &a; //指向一个常量的常量指针,指针和指针指向的对象都不能修改
    const int *p4;
    
    std::cout<< p<<"," << a <<endl;
    //p4 = p++;
    std::cout<< p1<<","<<p<<"," << a <<endl;


 

函数返回 局部变量问题

#include <stdio.h>
#include <string.h>

char* get_str(void)
{
        char* str = "abcd";
        return str;
}

int main(int argc, char* argv[])
{
        char* p = get_str();
        printf("%s\n", p);

        return 0;
}


上述代码中,str是局部变量,函数返回后应该释放掉了,但为什么get_str返回后,还能正常输出呢?
 
char *str="abcd"; 这种方式内存分配在静态存储区,str指向"abcd"这一字符串常量,get_str()函数返回指向这一字符串常量的地址的指针,所以会有main中的打印结果
 
 
字符串常量的地址是存放在局部变量str中的,get_str()返回后这个局部变量str被释放了,怎么会有正确结果呢?
 
打个比方:
阿四知道CU网站的地址。
阿三打电话给(call)阿四,“阿四,告诉我CU网站的地址”
阿四告诉阿三CU网站的地址后就跑掉了,阿四不见了,但CU网站还在。
阿三知道了CU网站的地址,也就找到了CU网站。
 
返回局部指针不正确,但如果局部指针指向静态区常量还是不会出错的
 
————————————————————————————————————————————————
 一般的来说,函数是可以返回局部变量的, 函数一般的操作是吧局部变量复制后返回给调用者,不能返回局部变量的是指针,因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。但是其他的值都是没问题的,其实都是一样的东西,只是指针在这种情况下被混淆了。
局部变量的作用域只在子函数内,在返回后,局部变量的内存已经释放。所以,如果是值的话,不涉及地址,程序不会出错。但是, 如果是地址的话,程序会在运行后出错!有时候这个错误不会在运行时马上出现,但是这个错误始终是潜在的风险!
————————————————————————————————————————————————————

1.sizeof(s),得出的长度不同。

对于字符串得到的是指针类型的长度(为4)。

对于字符数组得到的是字符数组的长度。

2char* s=”hello”;

s[0]='a';//wrong!运行时显示为“段错误”。

字符数组是可以修改的。

3。作为返回值时不同。

char* test(){

char ch[5]={'h','i'};//gcc 会警告:返回局部变量。

return ch;

这个函数是错误的,因为字符数组ch是局部变量,当test调用结束是占用的空间将被释放。

改为:static char ch[5]={'h','i'};

或: char* ch=”hi”;

就可以了。

4。声明外部变量时,字符数组和字符串为不同类型。

File1.中:char version[]=”2.12”;

File2. : char* version=”2.12”;

File3. : extern char* version;

实际上,File3version只能引用File2中的值,而引用File1中的 version时导致类型冲突。

 

————————————————————————————————————————————

局部变量里面还得分为自动还是静态,两者结果是不同的,得分开描述。 

数组是不能作为函数的返回值的,原因是数组名是一个不可修改的左值,例如这样的代码是非法的: 

int func( void )[5]; 

返回一个数组一般用返回指向这个数组的指针代替,而且这个指针不能指向一个自动数组,因为函数结束后自动数组被抛弃,但可以返回一个指向静态局部数组的指针,因为静态存储期是从对象定义到程序结束的。例如: 

int* func( void ) 

    static int a[10]; 
    ........ 
    return a; 


局部变量也分局部自动变量和局部静态变量,由于c返回的是值,因此返回一个局部变量是可以的,无论自动还是静态,因为这时候返回的是这个局部变量的值,但不应该返回指向局部自动变量的指针,因为函数调用结束后该局部自动变量被抛弃,这个指针指向一个不再存在的对象,是无意义的。但可以返回指向局部静态变量的指针,因为静态变量的生存期从定义起到程序结束。例如: 

int func() 

      int a; 
      .... 
      return a;    //允许 
}                    

int * func() 

      int a; 
      .... 
      return &a;    //无意义,不应该这样做 


局部指针跟上面所述的局部变量一样。可以返回一个局部指针的值,也可以返回一个局部静态指针的地址,但不应该返回一个局部自动指针的地址。 
——————————————————————————————————————————————————————————

局部指针的话,通常人都认为指向的局部变量失效,那该地址存的是垃圾值,其实不然,系统要在接到你要操作这个内存的指令后才会把它清0,它并不是立刻清0,就好比文件一样,并不是接到指令立刻把文件全清0,只是标记告诉系统这个空间可用,文件一般是在的。 
数组也是一样,下面有个小实例,第一个能正常输入,第二个则不行,因为在它之前操作了这块内存,操作了这块内存。

C/C++ code
    
    
#include " stdafx.h "  
char * Cstr( void
{  
char a[ 10 ] = " like " ;  
return a;  
}
int main( void
{  
char * a = Cstr();  
printf( " %c\n " , * (a + 1 ));  
return 0;  
    
    
}
————————————————————————————————————————————————
局部变量:如果是基本变量,可以直接返回;如果是自定义变量,基本都是使用指针参数带出。 

    
    
       
       
int Sum( int a, int b ) // 基本变量没什么问题。  
{ return (a + b); }  
int DoSomething( const struct MyStruct * pParamIn1, const struct MyStruct * pParamIn2, struct MyStruct * pParamOut ) 
{  
// 在这里处理pParamIn1和pParamIn2指向的结构体,将结果保存到pParamOut指向的结构体中  
// 带出函数,返回值只表示函数处理成功还是失败以及可能的失败原因
}


局部指针:如果指针指向的内存是在函数内部申请的,基本不干返回指针这种事,做这种事情很有可能是在给自己找麻烦,多数做的都是在可以释放的地方申请好内存,通过指针传递进函数,申请和释放都在同一函数中。
       
       
void ToBeCalledByFun( SomeType * pParam ) // 被调用函数不申请堆内存  
{ // Do something to *pParam }  
void Fun( /* some parameters */ )
{  
SomeType * pCallMem = (SomeType * )malloc( sizeof (SomeType) ); // 内存申请放在free的同一个函数里  
ToBeCalledByFun( pCallMem ); // Do something  
free( pCallMem );  
pCallMem = NULL; 
}


局部数组:我相信没什么人想返回这个东西

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值