C加加中的数组与指针-基础语法

首先先给上代码

#include<iostream>
using namespace std;

void sz_1()
{
    const int maxsize = 100;
    int const maxsize1 = 50;
    cout<<"maxsize:"<<maxsize<<endl;
    cout<<"maxsize1:"<<maxsize1<<endl;

}

void sz_2()
{
    char buffer[5] = "char";
    char buffer_1[5] = {"char"};
    //char buffer_2[5] = {'c','h','a','r'};
    //char buffer[5] = "12345";
    int sz[5] = {1,2,3,4};
    cout<<"sz[4]:"<<sz[4]<<endl;
    cout<<"buffer:"<<buffer<<endl;
    //cout<<"buffer_1:"<<buffer_1<<endl;
    cout<<"sz:"<<sz<<endl;
    //cout<<"buffer_2:"<<buffer_2<<endl;
    char hello[] = "hello world";
    int length = sizeof(sz)/sizeof(int);
    cout<<"hello:"<<hello<<endl;
    cout<<"length:"<<length<<endl;
}

void sz_3()
{
    const int maxsize = 50;
    long long sl[maxsize];
    sl[0] = 1;
    sl[1] = 1;
    for(int i=2;i<maxsize;i++)
        sl[i] = sl[i-1] + sl[i-2];
    for(int i = 0;i<maxsize;i++)
        cout<<sl[i]<<endl;
}

void sz_4()
{
    char array[30];
    cin.get(array,30);
    cout<<"array:"<<array<<endl;
    //cout<<array[6]<<endl;
}

void sz_5(int a[])
{
    int length = sizeof(a)/sizeof(int);
    int sum = 0;
    for(int i=0;i<5;i++)
    {
        sum += a[i];//sum = sum + a[i]
    }
    cout<<"length:"<<length<<endl;
    cout<<"sum:"<<sum<<endl;
}

void sz_6(int two[][3],int three[])
{
    cout<<two[1][1]<<endl;
    cout<<three[1]<<endl;
}

int main()
{
    int one[] = {1,2,3,4,5};
    int two[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
    //sz_1();
    //sz_2();
    //sz_3();
    //sz_4();
    //sz_5(one);
    //sz_6(two,&two[0][0])
}


#include<iostream>
using namespace std;
#include<stdlib.h>
#include<string.h>

void zz_1()
{
    int c = 5;
    int * a = &c;
    cout<<"c的地址是:"<<&c<<endl;
    cout<<"a指针的地址是:"<<&a<<endl;
    cout<<"a指针指向变量的地址是:"<<a<<endl;
    cout<<"a指针指向变量的值是:"<<*a<<endl;
}

void zz_2()
{
    int c = 5;
    int d = 10;
    const int * a = &c;
    //*a = 7;
    int * const b = &c;
    //b = &d;
    int const * e = &c;
    //*e = 7;
    const int * const f = &c;
    //*f = 10;
    //f = &d;
}

void zz_3()
{
    int * a;
    *a = 55;
    cout<<a<<endl;
}

void zz_4()
{
    int array[10];
    for(int i=0;i<10;i++)
        array[i] = i;
    int * a = array;//int *a = &array[0]
    int sum = 0;
    for (int i=0;i<10;i++)
        {
        sum += *a;
        a++;
        }
    cout<<"sum:"<<sum<<endl;

}

void zz_5()
{
    int array[10];
    for(int i=0;i<10;i++)
        array[i] = i;
    //array++;
}

void zz_6()
{
    int * array = (int*)malloc(40);
    for(int i = 0;i<10;i++)
    {
        array[i] = i;
        cout<<array[i]<<endl;
    }
    free(array);
    cout<<array[0]<<endl;
}

void zz_7()
{
    int *array = new int[10];
    for(int i = 0;i<10;i++)
    {
        array[i] = i;
        cout<<array[i]<<endl;
    }
    delete[] array;
    cout<<array[2]<<endl;

}

void zz_8()
{
    char *a = "char";
    char *b = "char";
    /*if ("char" == "char")
        cout<<"equal"<<endl;
    else
        cout<<"not equal"<<endl;*/
    if (strcmp(a,b)==0)
        cout<<"equal"<<endl;
    else
        cout<<"not equal"<<endl;


}


int main()
{
    //zz_1();
    //zz_2();
    //zz_3();
    //zz_4();
    //zz_5();
    // zz_6();
    //zz_7();
    //zz_8();

}
                          数组

数组: 类型说明符 数组名[常量表达式]
常量表达式(sz_1) int const maxsize = 100;
const int maxsize = 100;
也就是说,定义数组时下标必须确定

例如:(sz_2)字符数组 char buffer[5] = {1,2,3,4,5};(定义+初始化)

  (数组一旦定义,再想给数组赋值就只能一个一个元素访问了)
    int数组的空余会用0补全
  注意:字符数组可以当作字符串使用,但5个元素的字符数组,字符串最长为4,因为最后一个元素用于‘\0’,用‘\0’字符结束的字符数组可以构成一个字符串。
    char buffer[5] = “char”;

  整数数组 int array[] = {1,2,3,4};
  可以用sizeof(array)/sizeof(int)来确定长度
  注意:当没有常量表达式的时候,可以根据你的初始化来确定长度。

用数组实现斐波拉契数列(优点:思路简单,易读性高)(sz_3)

你也可以用输入的方法的来给字符数组(字符串)赋值。(sz_4)

把数组传递给函数(sz_5),但是数组长度用sizeof就不可靠了

二维数组:
Eg:int b[2][3] = {{1,2,3}{4,5,6}}
还可以省略第一维大小:
Int b[][3] = {1,2,3,4,5,6}

普通二维数组传递和降维传递(sz_6)

   指针

指针的定义语句:由数据类型后跟*号,再跟随指针变量名组成。

每一个变量都有值域和地址域,指针也是变量。但指针的值域是地址(它指向的那个值的地址),所以指针的作用就是存其他变量的地址。

  • :取值符,取的是指针指向的那个变量的值
    &:取地址符,取变量的地址 (这两条非常重要!!!)(zz_1)
    int c = 5;
    Int * a = &c;(注意,指针只能指向该数据类型的变量)
    在指针定义中,一个*只能表示一个指针

(zz_2)
const int * a = &c; (const 修饰的是int,即指向的int变量的值不能变,即妄图用 *a=?来改变c是不被允许的)

int * const a(const 修饰的是a,a代表一个指针地址,因此a不能再指向其他的int变量了)

int const * a 与 const int * a 作用相同

Int const * const a 都不能改变

指针忘了赋值很危险(zz_3)
指针运算(zz_4)指针运算能用于加减法。但必须有意义。不然会是危险的,比如指向数组首地址的指针,做减法,就会是危险的。

注意:++a 与a++,
a++:先赋值再相加
++a:先相加再赋值

下标操作不是针对数组,而是针对地址:
比如数组int a[] 的首地址是a,而a+i就是第i+1个元素的地址。
*(a+i)就是第i+1个元素的值,体会一下这里为啥是i+1

数组名是指针常量,不是指针变量,即数组首地址不是左值,不能修改,也就是说,不能做指针(地址)运算。
(zz_5)中的array++修改了数组首地址,故报错。(那行被我注释了,因为不注释过不了编译)
堆内存分配:
申请堆空间(允许在执行时而不是在编译时申请)
eg:int array = (int )malloc(arraysize*sizeof(int));
(zz_6) arraysize是地址个数
arraysize*sizeof(int) 其实就是说你要申请多大的内存空间
最后可用free(array)释放堆空间;

c++中不同于C的申请堆空间
new与delete:
new的使用要比malloc方便一些。
(zz_7)
注意:
1)c++中delete指针后,这块内存仅被标记为可以使用,在没有被分配之前里面的内容还是完好的。而且delete不负责将指针设置为NULL。
2)使用已经delete的指针的行为是未定义的,这种指针成为悬挂指针(指针指向非法的内存地址,也称为野指针),不要依赖于这类行为。
3)是否在delete之后立马设置指针为NULL呢,关于这个问题,很多人看法不太统一。
同理free也一样

指针函数:返回值是指针的函数,也就是说,返回值是一个地址
eg:int * () {}
指针函数不能返回局部变量的地址,但可以返回全局,静态,堆变量的地址。

Void 指针,空类型指针。不指向任何类型。仅仅只是一个地址。空类型指针不能进行指针运算,也不能进行间接引用。
关于字符串比较(zz_8)

指针数组:元素是指针的数组
eg:int * a[];
指针数组有时也可以用二维数组表示;

指针数组名是指向指针的指针,即二级指针;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值