C/C++知识点之C语言盲点笔记1
小标 2018-11-13 来源 : 阅读 891 评论 0

摘要:本文主要向大家介绍了C/C++知识点之C语言盲点笔记1,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之C语言盲点笔记1,通过具体的内容向大家展示,希望对大家学习C/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;
}

    #include <stdio.h>   
    char *returnStr()   
    {   
        char p[]="hello world!";   //错误,数组空间为临时的变量,在栈区域
        return p;   
    }   
    int main()   
    {   
        char *str;   
        str=returnStr();   
        printf("%s\n", str);   
        return 0;   
    }  


5。返回指向堆内存的指针是可以的

    char *GetMemory3(int num)  
    {  
    char *p = (char *)malloc(sizeof(char) * num);  
    return p;  
    }  
    void Test3(void)  
    {  
    char *str = NULL;  
    str = GetMemory3(100);  
    strcpy(str, "hello");  
    cout<< str << endl;  
    free(str);  
    }

#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/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程