C和指针 学习笔记(一)

1:未初始化和非法变量

在定义指针时一定要初始化,确保其指向一个合法的地址。或者利用malloc()分配地址空间。

2:在确认一个指针是否指向NULL时可以与0 比较, 这只是一个约定而已/

3:在对NULL指针进行间接访问时容易出错!

4: *(int*)100=25; *100=25; 两条语句的区别: 第一是非法。第二是吧25放到地址100处。

5:辅助函数:statice类型,也就是实现所谓“黑盒”:加上statice修饰符后其他源代码无法调用此函数,让程序更加独立。

6:尽量少使用递归,效率太低!

7:数组B[10]; B是一个指针常量。其有确定的指向和分配好的空间。当然常量不能修改,不能被赋值。

8:int  * ap = arry[2]; ap[0] 与*ap表示的意义相同。ap[-1] ==arry[1]; 相当与*(ap-1)

9: 指针比下标更有效率。

10:char *arry="hello" char arry[]="hello" 前者才是真正的字符串。后者相当于一个字符数组。
11:strlen(arry)-strlen(x)>=0这个表达式永远成立, strlen计算出的为无符号整形,两个无 运算得无、

12:  高级字符串处理函数 strspn(char const *str char const *group) 在group中寻找 是str字符串

13:结构体的自引用
       struct selp
{
int  a;
 struct selp-ref b;
int  c;
}
这个是不合法的 selp 有自己的结构体,b也有自己的结构体............反复下去样子就像递归、长度无法预测、
struct selp
{
int  a;
 struct selp *b;
int  c;
}
正确的! 因为编译器在 结构体之前就已经知道 指针的长度!


14:  分配内存的时候最好用 malloc((数量)*sizeof(类型名)这样分配 可移植性好!

15: assert 宏 assert(1 == 0);  打印出类似Assertion failed: 1 == 0, file d:\我的文档\visual studio projects\learning\assert\assert.cpp, line 9的信息/

16: int *f() int (*f) (); 前者是声明的返回值为 指向int型的指针。后者f是指向int型函数的指针。

17: int (*f[ ]) () 根据运算符优先级 可知 f是一个 元素为“指向 int类型函数的指针” 的数组 。函数指针数组

18:函数指针声明 int f(); int (*pf)()=&f;即可,其中&可选,以为程序调用函数会将函数名转化为函数指针,&只是显式的说明了编译器将隐式执行的任务。 int ans;ans = f(25);ans=*pf(25); ans = pf(25); 以上三条赋值语句效果是一样的、

19:字符串常量:

当一个字符床常量出现在表达式中的时候,他的值是一个指针常量。

“xyz”+1 的值就是’y‘,“xyz”[2] 的值就是z

应用: 打印星号...效率很高!

void mystery(int n)
{
    n+=5;
    n/=10;
   printf("%s\n","*********"+10-n);
}

20:   注意预定义的换行时的反斜杠‘

21:perror(char const *ch)只要ch不是NULL就打印出CH的字符串

       void exit(int status) 执行完这个函数之后程序结束/

22 :  ms—dos下的文本流结束的标志是以一个回车或者换行符结尾,unxi下为一个换行符。

23:流通过fopen函数打开,fclose关闭。



     

22: ungetc(ch,stdin)将字符ch返回标准输入流。

23:char *fgets(char * buffer , int buffer_size , FIFIE  * stream) ;

         char  *fputs  (char const *buffer ,FIFE *stream);  如果任何字符读取前就达到了文件尾,缓冲区就未进行修改,fgets函数就返回一个NULL指针,否则返回它的第一个参数(指向缓冲区的指针)。
24: fread(char * buffer ,size_t size , size_t count , FIFE *stream)  ,fwrite(char * buffer ,size_t size , size_t count , FIFE *stream)  buffer 为存储 字符的数组, size 为 存储元素的长度,count 为数量。stream为数据读取或存放的流/

25: ftell(FIFE *stream) 其返回值是流的当前位置。在二进值流中这个值就是当前位置距离文件起始位置的字节数。
26: printf("%d",3.14);不会打印出3! 具体值要看编译器。
      sscanf() - 从一个字符串中读进与指定格式相符的数据.
  函数原型:
  int sscanf( const char *, const char *, ...);
  int sscanf(const char *buffer,const char *format,[argument ]...);
  buffer 存储的数据
  format 格式控制字符串
  argument 选择性设定字符串
  sscanf会从buffer里读进数据,依照argument的设定将数据写回。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值