C语言盲点笔记1

时间:2022-02-16 09:39:52

寥寥数笔,记录我的C语言盲点笔记,仅仅为以前经历过,亦有误,可交流。

1.int* a和int *a有差别吗?

没有不论什么差别,都表示a是int指针
建议这么写int *a;这样明显一点
理由例如以下
int *a,b;
a是指针,b是整形,一幕了然
可是你假设写成int* a,b;
尽管a还是指针,b还是整形
可是a前面没直接跟*。一不留神。还真把b看成指针了 2.C语言中和单片机C语言的数据类型char,前者是字符串类型,后者和int一样是8位的数据类型
3.c语言malloc申请结构体内存。通过free释放
4.C语言函数不能返回局部变量的地址
#include <stdio.h>
char *returnStr()
{
char *p="hello world!"; //同意
return p;
}
int main()
{
char *str;
str=returnStr();
printf("%s\n", str);
return 0;
}
  1. #include <stdio.h>
  2. char *returnStr()
  3. {
  4. char p[]="hello world!";   //错误,数组空间为暂时的变量,在栈区域
  5. return p;
  6. }
  7. int main()
  8. {
  9. char *str;
  10. str=returnStr();
  11. printf("%s\n", str);
  12. return 0;
  13. }
5。返回指向堆内存的指针是能够的
  1. char *GetMemory3(int num)
  2. {
  3. char *p = (char *)malloc(sizeof(char) * num);
  4. return p;
  5. }
  6. void Test3(void)
  7. {
  8. char *str = NULL;
  9. str = GetMemory3(100);
  10. strcpy(str, "hello");
  11. cout<< str << endl;
  12. free(str);
  13. }
#include <stdio.h>

//此函数中d也是个局部变量。函数运行完自己主动销毁,可是指针分配的空间不会被自己主动回收,除非程序猿delete掉。

//所以这个能够正常输出。

char *a()
{
char *d = "ZET";//这个初始化的一种形式,相当于分配了四个空间
return d;
} //可是第二个数组空间是系统维护的。函数运行完自己主动销毁
char *b()
{
char p[10] = {"3G平台"};
return p;
}
上面两列子充分说明。在c语言中。字符串常量。和字符数组存储的位置不一样,前者存放在字符串常量区,后者是在栈区开辟的暂时内存,尽管a的数值在编译时就规定了(因此a的值不能做改动) //參数是值传递方式,改变形參的地址,传递的实參的地址确不会因此改变
void c(int n,char *pName)
{
char *a[4] = {"aaa","bbb","ccc","ddd"};
pName = a[n];
} void main()
{
int n=0;
char *pName = "DB";
printf("%s\n",a());//输出ZET
printf("%s\n",b());//随机输出乱码 c(2,pName);
printf("%s\n",pName); //输出DB,由于char *pName = "DB";已经使得pName指向了DB,但c(2,pName);并不能改变pName指向的地址。
//形象点说就是:我有一个箱子给你用。你能够在里面装东西,可是你不能把我的箱子换成另外一个给我。 //在这里指的是不能函数调用不能使pName变成函数中的二维数组a。 scanf("%d",&n);
这个样例充分说明在函数中,不能对传入的指针代表的地址做转化,这个如p=a,这时的p是函数在栈开辟的。
不再代表实參所表示的地址,也近一步说明要是在函数内部给形參赋值,那么这个形參就会自带获取一个内存,
而实參的内容不变,故指针传入仅仅能改动其指向的内容,改动他的数值(地址)是没有意义的。 主函数是实參数表示的地址没有变化 6.一般涉及字符串操作时,最好使用标准的字符串操作函数,如strcpy,strcat。strcmp等
同一时候这些函数传入的指针初始化得指向char类型,不能是unsigned char否则出现例如以下警告pointer targets in passing argument 1 of 'strlen' differ in signedness
7,一级指针传在函数中,能够改动函数指定的值。2级指针就能够改动指针指向的位置。
8.c语言中int数据类型强制转化为char型,仅仅保留最低的8位,如int a ;(unsigned char)a.
char型(1字节)赋值给int型(2字节):数值赋给int的低8位。高8位补0
9,int *p和char *p中。p++,在内存空间看来。前者移动4个字节int型数据。后者仅仅移动1个字节。
10 .c语言中对文件的操作嵌入式开发主要是fopen,fread,fwrite,这些操作主要针对2进制的文件进行数据的读和写,
fopen:wb 仅仅写打开或新建一个二进制文件。仅仅同意写数据。rb 读写打开一个二进制文件。仅仅同意读写数据。ab表示运行读和写
11.字符串数组和普通字符串的差别在于后者分配内存时自己主动在后面加ASCII为0的\0结束符号。也就是0x00.
12.

C语言中数组的名字不能改变。数组名编译时默觉得指针常量const。程序呢不同意出现有改动

C语言里定义一个字符串能够使用指针也能够使用数组,如:
(1) char *s="hello"; //"hello"是字符串常量,属于const 类型。s是指向字符串常量的指针,常量仅仅能读。是不同意改变的。不能写成s[0]=X,但能够改变指针的值。使其指向不同的常量。如 s = "Xeron";

(2) char s[]="hello"; //指针常量,s本身的值不能改动。但能够改动其指向的内容,s[0]=X

两者的差别是
(1)前者定义的字符串在程序里不能被改动,由于它存放在代码段内,字符常量区;
(2)后者定义的字符串可被改动。它存放在数据段或者栈内。
字符串内容要发生改动的多考虑使用字符串数组
13.fread和fwrite开辟的缓存区的话,最好用char类型的指针作为Buffer的地址
同一时候须要指定buffer的大小,否则会出现Segmentation fault错误
14.要善于使用数据类型的强制转化。这个对数据在内存的存储结构紧密相联系

15.C语言函数參数入栈顺序从右到左。使得能够确定动态參数的个数。

C语言盲点笔记1的更多相关文章

  1. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

  2. JavaScript语言精粹笔记

    JavaScript语言精粹笔记 掌握语言的每个特性可以让你出风头,但是并不推荐,因为一部分的特性带来的麻烦可能远超本身的价值.正如书中所言,坏的材料并不能雕刻出好的作品,要成为一名更好的程序员,要取 ...

  3. c语言的笔记

    下面把我这半年来记的一些C语言的笔记贴出来. 1  C语言中函数参数传递是按照“值传递”进行的,即单向传递. 2  函数原型:函数类型 函数名(参数类型,参数类型……),可以不必加参数名,因为操作系统 ...

  4. C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 &vert; IT宅&period;com

    原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...

  5. 2017-04-21周C语言学习笔记

    C语言学习笔记:... --------------------------------- C语言学习笔记:学习程度的高低取决于.自学能力的高低.有的时候生活就是这样的.聪明的人有时候需要.用笨的方法 ...

  6. 2017-05-4-C语言学习笔记

    C语言学习笔记... ------------------------------------ Hello C语言:什么是程序:程序是指:完成某件事的既定方式和过程.计算机中的程序是指:为了让计算机执 ...

  7. GO语言学习笔记(一)

    GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...

  8. Haskell语言学习笔记(88)语言扩展(1)

    ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...

  9. Go语言学习笔记十三: Map集合

    Go语言学习笔记十三: Map集合 Map在每种语言中基本都有,Java中是属于集合类Map,其包括HashMap, TreeMap等.而Python语言直接就属于一种类型,写法上比Java还简单. ...

随机推荐

  1. ubuntu下查找某个文件的路径

    参考:ubuntu下如何查找某个文件的路径      http://blog.csdn.net/lieyanhaipo/article/details/17055667 在Ubuntu有时候会遇到记得 ...

  2. Android Studio ---------------- 软件使用小细节&lpar;更新中。。。。。。&rpar;

    ###鼠标放到相关类或方法等上,没有提示. *解决方法:File----Setting-----Editor-----General------Show quik documentation on m ...

  3. javac命令详解(下)

    摘自http://blog.csdn.net/hudashi/article/details/7058999 javac命令详解(下)                             -ver ...

  4. JavaSE&lpar;一&rpar; IO类层次关系和各种IO流的用法总结

    今天把IO流的这一知点进行一下总结,因为在之前使用io流的时候,就只知道几个重点常用的IO类,比如FileInputStream,BufferedInputStream(缓冲流)等等,但是不知道它处于 ...

  5. unity创建和加载AssetBundle

    先说一下为什么要使用AssetBundle吧,以前做东西一直忽略这个问题,现在认为这个步骤很重要,代码是次要的,决策和为什么这样搞才是关键. 一句话概括吧,AssetBundle实现了资源与服务分离, ...

  6. ES6的介绍和常用语法

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 前言 ECMAScript 是 JS 的语言标准.而 ES6 是新的 J ...

  7. TestNG的简单使用

    TestNG的简单使用 TestNG(Test Next Generation)是一个测试框架,其灵感来自JUnit和NUnit,但同时引入了一些新的功能,使其功能更强大,使用更方便. TestNG是 ...

  8. 201621123031 《Java程序设计》第8周学习总结

    作业08-集合 1.本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2.书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 源代码 ...

  9. loading js备份

    loadingManageEdit.jsp $(function(){ //组织 var lodingDeparts =[<c:forEach items="${lodingDepar ...

  10. Nginx 分布式session共享问题

    在集群的时候每次访问,都会被代理转到不同的服务器,那么在这些服务器之间如何共享session? 解决方式1:session复制 只能在window下好使,web服务器解决(广播机制,将一台机器上的se ...