C基础 个人笔记

笔记 同时被 2 个专栏收录
5 篇文章 0 订阅
1 篇文章 0 订阅

strlen()函数 和 sizeof 关键字

strlen 是一个函数,它用来计算指定字符串 str 的长度,但不包括结束字符(即 null 字符)。
其原型如下面的代码所示:
size_t strlen(char const* str);

char array[100] = "abc";
/*用strlen()求长度*/
printf("array的长度=%d\n", strlen(aray));

运行结果为 3
关键字 sizeof 是一个单目运算符,而不是一个函数。与函数 strlen 不同,它的参数可以是数组、指针、类型、对象、函数等
如下面的示例代码所示:

char array[100] = "abc";
/*用sizeof求长度*/
printf("array的长度=%d\n", sizeof(array));

示例代码运行结果为 100

typedef 和define

typedef (int*) pINT;
#define pINT2 int*

效果相同?实则不同!实践中见差别:
pINT a,b;
效果同int *a; int *b;
表示定义了两个整型指针变量。
pINT2 a,b;
效果同int *a, b;
表示定义了一个整型指针变量a和整型变量b。

函数传参

函数形参在函数定义的时候是不占有内存空间的,当调用函数的时候,将实参传给形参的时候,才给形参分配内存空间。
return 语句一次只能返回一个值,当要返回多个值得时候,可以让参数双向传递。

#include<iostream>
#include <cstdio>
#include <cstring>
using namespace std;
void swap(int& a,int& b)
{
    int t =a;
    a=b;
    b=t;
    cout<<"swap a= "<<a<<" ,b= "<<b<<endl;
}
void swap2(int* a,int* b)
{
    int t =*a;
    *a=*b;
    *b=t;
    cout<<"swap2 a= "<<*a<<" ,b= "<<*b<<endl;
}
void splitFloat(float x,int* intPart,float* floatPart)
{
    *intPart = static_cast<int>(x);
    *floatPart = x-*intPart;
}
void swap3(int a,int b)
{
    int t =a;
    a=b;
    b=t;
	cout<<"swap3 a= "<<a<<" ,b= "<<b<<endl;
}
void foo(int* p,int &i)
{
    p=0;
    i=5;
}
int count_add(int n)
{
    static int ctr = 0;
    ctr += n;
    return ctr;
}
int add(int x = 5,int y = 6)
{
    cout<<"add x+y= "<<x+y<<endl;
    return x+y;
}

int main()
{
    int k=1,m=2;
    int& i = k; //定义变量k的引用
    cout<<"before k= "<<k<<" ,m= "<<m<<endl;
    cout<<"值传递--->"<<endl;
	swap3(k,m);
	cout<<"after k= "<<k<<" ,m= "<<m<<endl;

	cout<<"引用传递--->"<<endl;
    swap(k,m);
    cout<<"after k= "<<k<<" ,m= "<<m<<endl;
    k=1,m=2;
    cout<<"指针传递--->"<<endl;
	swap2(&k,&m);
	cout<<"after k= "<<k<<" ,m= "<<m<<endl;
    float x=3.14;
    float f;
    int n;
    splitFloat(x,&n,&f);
    cout<<"after 整数部分= "<<n<<" 小数部分= "<<f<<endl;
	cout<<"指针传递+引用传递--->"<<endl;
    foo(&k,m);
    cout<<"after k= "<<k<<" ,m= "<<m<<endl;
    cout<<"static 局部变量作用域--->"<<endl;
    for(int i =0;i<4;++i)
    {
        printf("%d\n",count_add(i));
    }
    cout<<"数组作为函数的参数--->"<<endl;


    cout<<"带默认参数值的函数--->"<<endl;
    add(10,20);
    add(10);
    add();
    cout<<"定义可变参数的函数"<<endl;
    //initializer_list <int> lst; ???
    return 0;
}

结果:

before k= 1 ,m= 2
值传递--->
swap3 a= 2 ,b= 1
after k= 1 ,m= 2
引用传递--->
swap a= 2 ,b= 1
after k= 2 ,m= 1
指针传递--->
swap2 a= 2 ,b= 1
after k= 2 ,m= 1
after 整数部分= 3 小数部分= 0.14
指针传递+引用传递--->
after k= 2 ,m= 5
static 局部变量作用域--->
0
1
3
6
数组作为函数的参数--->
带默认参数值的函数--->
add x+y= 30
add x+y= 16
add x+y= 11
定义可变参数的函数

函数重载

形参不同:指形参个数不同或形参类型不同

指针类型的函数

不要将子函数中定义的局部变量地址返回给主函数。
可以将变量在主函数中定义。
在子函数中new出来的内存地址返回给主函数也是合法的。要注意释放。
在这里插入图片描述

指向函数的指针(回调)

在这里插入图片描述

#include <iostream>
using namespace std;
int computer(int a,int b,int(*func)(int,int)){
    return func(a,b);
}
int max(int a,int b){
    return ((a>b)?a:b);
}
int min(int a,int b){
    return ((a<b)?a:b);
}
int sum(int a,int b){
    return a+b;
}

int main()
{
    int a,b,res;
    cout<<"请输入整数a:";cin>>a;
    cout<<"请输入整数b:";cin>>b;
    res = computer(a,b,&max);
    cout<<"Max is "<<res<<endl;
    res = computer(a,b,&min);
    cout<<"Min is "<<res<<endl;
    res = computer(a,b,&sum);
    cout<<"Sum is "<<res<<endl;
}

结果:

请输入整数a:10
请输入整数b:30
Max is 30
Min is 10
Sum is 40

数组与指针

#include <iostream>
using namespace std;
// 基本概念
int main()
{
    int a[10]={0,1};
    int* pa;
    pa = &a[0];
    cout <<"pa = "<<pa<<endl;
    cout <<"&a[0] = "<<&a[0]<<endl;
    cout <<"a = "<<a<<endl;
    cout <<"*pa = "<<*pa<<endl;
    cout <<"a[0] = "<<a[0]<<endl;
    cout <<"*(pa+1) = "<<*(pa+1)<<endl;
    cout <<"a[1] = "<<a[1]<<endl;
}

结果:

pa = 0x28fed4
&a[0] = 0x28fed4
a = 0x28fed4
*pa = 0
a[0] = 0
*(pa+1) = 1
a[1] = 1

指针数组和二维数组

#include <iostream>
using namespace std;
int main()
{
    int line1[]={1,0,0};
    int line2[]={0,1,0};
    int line3[]={0,0,1};

    //指针数组
    int* pline[3] = {line1,line2,line3};
    cout<<"打印矩阵:"<<endl;
    for (int i = 0;i<3;i++)
    {
        for(int j = 0;j<3;j++)
        {
            cout<<pline[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

结果:

打印矩阵:
1 0 0
0 1 0
0 0 1

二维数组是一段连续存储的空间。
指针数组,不是连续存储。
在这里插入图片描述

this 指针

隐含于类的每一个非静态成员函数中
return x ;
return this->x;

c++11 智能指针

unique_ptr:
shared_ptr:
weak_ptr:

深拷贝和浅拷贝

成员有指针,使用深拷贝构造函数

在这里插入图片描述

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页

打赏作者

qq_31759493

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值