课堂笔记(指针标准使用方式)

2.解释*ptr=“hello world”按照上课内容讲,例如对应,指针

       1)char *ptr;

           ptr=”hello world”;             //赋值合法,ptr获得’h’的地址

       2)char *ptr;

          strcpy(ptr,”hello world”);        //非法,ptr为野指针,无法复制

       3)#include<stdlib.h>             //malloc头文件

#define LEN sizeof(char) * 100

char *ptr = (char *)malloc(LEN)  //分配100个字节(参见注释***)                       

            if(p==NULL)

{     

printf(“%d:malloc error!\n”,_LINE_);   //报错并输出哪一行

                  exit(1);                //直接退出程序

}

           memset(ptr,0,LEN);              //将这块分配的内存空间初始化

           strcpy(ptr,”hello world”);         //合法,

           printf(“ptr = %s\n”,ptr);

           free(ptr);                      //释放ptr,

           ptr = NULL;                     //再次置空,防止再次成为野指针

           return 0;

注释***

(char *)把malloc的返回值强制转换为指针

原因:指针赋值一定要是相同类型赋值

linux强行赋值后:警告:从不兼容类型赋值

原因:不同类型指针赋值,由于步长不同,

1.例如(int)指针能获得4字节的地址,而赋值给(char)指针后,

短指针(char)只能获得1个字节,会造成数据丢失

反之,短指针(char)赋值给长指针,(int)会多获得数据

2.浮点型千万不要和任何其他类型赋值,由于小数点存在,会造成更

大错误

 

void *p 万能指针:可以保存任何类型的指针赋值

      缺点:void * 不可被取值printf(“%d”,void *p);  //非法

            原因:void * 没有步长,不知道该取多长的地址

            解决:把void * 强制类型转换为其他类型

      注意:void * ++;  默认步长为一个字节

            原因:编译器不知道void * 应该跳几个字节,产生二义性

 

 

指针运算

1.指针+/-整数代表跳一定的步长

2.指针与指针之间只有减法,没有加法,两个指针相减事结果为它们之间相差的步

长(也就是相差元素的个数(数组指针))

 

 

常见段错误:1.存在野指针

            2.给NULL指针赋值

            3.scanf获取时忘了&取地址符

 

11.30.2016

面试

   1.比较难得问题请求面试官给半分钟整理思路

2.带个本子记录回答思路和面试官给你的建议与意见

 

存储类

1.作用域:描述程序可以访问一个标识符的一个或多个区域

   1)代码块作用域:两个花括号之间的代码区域

   2)函数原型作用域:适用于函数原型中使用的变量

                 int sum(int i,int j,char a[i][j])   //声明时[][]中的i,j也需要声明

       3)文件作用域:在所有函数之外声明的变量具有文件作用域,也就是全局变量,可

见范围为从定义处到该定义的文件结尾处

2.链接:linkage

   1)外部链接extern

int a;(全局)       //文件作用域,外部链接,其他文件可用

      2)内部链接staticstatic表示链接类型,而不是存储时期类型

                  static int a;(全局)  //文件作用域,内部链接,本文件可用

      3)空链接自动变量寄存器(register)的链接类型

3.存储时期

     1)静态存储时期:所有全局变量(文件作用域变量),一旦分配内存后始终存在,直到程序结束

     2)自动存储时期:所有局部变量,一个函数调用后,它所持有的内存释放给下一个程序使用

                int a=10;           //“a”为上一个函数的局部变量

                int b;               //“b”为下一个函数的局部变量,未初始化

                解析:由于局部变量“b”保存在栈空间,未初始化的话应该随机赋值,“b”获得上一个局部变量的内存空间,这个随机值就是上一个局部变量的值(不一定就是“a”),

4.自动变量auto  (局部变量)

   显式声明自动变量:auto int a;         // auto为存储类型说明符

     作用:为了有意覆盖一个外部函数的定义或表明不能把此变量改变为其他存储类(主要用来强调)

  5.寄存器变量register(存放于CPU寄存器的变量)***(冷门知识)

        1)无地址:普通自动变量具有地址,是因为它们位于内存;而寄存器没有地址,所以无法获得寄存器变量的地址;

        2)大部分特性等同于自动变量

        3)register int a;  (这是一个申请,不是命令)这个申请不一定成功,因为系统会考虑可用寄存器数量与高速缓冲内存数量之间的平衡,如果申请失败,则变为自动变量,依然无法获得地址

        4)可用数据类型有限:因为CPU寄存器不一定能容纳double类型,一般只能为int,char,指针

        作用在程序运行时,根据需要到内存中相应的存储单元中调用,如果一个变量在程序中频繁使用,例如循环变量i,那么,系统就必须多次访问内存中的该单元,影响程序的执行效率

 

常见字符串处理函数:****

 

char src[100];

void * p=memset(p,’a’,sizeof(src)-1);    全部赋值a,长度减一,以保存末位的’\0’

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值