c语言数组的笔记,C语言笔记 数组 指针

声明相当与普通的声明:所说明的并非自身,而是描述其他地方创建的对象。

定义相当于特殊的声明:它为对象分配内存。

定义指针时,编译器并不为指针所指的对象分配空间,只是分配指针本身的空间,除非在定义的同时赋值给指针一个字符串常量,进行初始化,并只有对字符串常量才能如此,并且初始化指针时所创建的字符串被定义为只读,无法修改这个字符串的值。

数组:声明:extern:如extern char a[]:不可以改写成指针的形式。

数组:声明:定义:如char a[10]:不可以改写成指针形式

数组:函数参数:如fun(char a[]):可选择数组或者指针的形式

数组:在表达式中使用:如c = a[i]:可根据自己喜欢,选择数组或者指针形式。

但数组和指针在编译器处理时是不同的,运行时的表达形式也不一样,并可能产生不同的代码,对编译器而言,一个数组就是一个地址,一个指针就是一个地址的地址。

作为函数定义的形式参数,数组的下表表达式总是可以改写成带偏移量的指针表达式。

何时指针和数组相同:

1.表达式中的数组名(与声明不同)被编译器当作一个指向该数组的第一个元素的指针。

2.下标总是与指针的偏移量相同。

3.在函数参数的声明中,数组名被编译器当作指向该数组的第一个元素的指针。

把作为形参的数组和指针等同起来是处于效率原因的考虑。

C语言中,所有的非数组形式的数据实参均以传值形式调用,对实参做一份拷贝并传递给调用的函数,函数不能修改作为实参的实际变量的值,只能修改传递给它的那份拷贝。函数返回值绝不能是一个函数数组,它只能是指向数组或者函数的指针。

所有属于函数实参的数组在编译时被编译器改写成指针,因此,在函数内部对数组参数的任何引用都将产生一个对指针的引用。

数组名是不可修改的左值,它的值不可改变。

数组和指针可交换性总结:

1.用a[i]对数组进行访问总是被编译器改写成或者解释为*(a+i)这样的指针访问。

2.指针始终就是指针,绝不可能改写成数组。可以用下标形式访问指针,一般都是指针作为函数参数时而且你知道实际传递给函数的是一个数组。

3.作为函数参数时,一个数组的声明可以看作是一个指针,作为函数参数的数组始终被编译器改成指向数组第一个元素的指针。

4.当把一个数组定义为函数参数时,可以选择将他定义为数组,也可以定义为指针。无论哪种方法,在函数内部事实上获得的都是一个指针。

5.在其他所有情况中,定义和声明必须匹配,如果定义了一个数组,在其他文件对他进行声明时也必须声明为数组,指针也是如此。

不能把数组赋值给另一个数组,因为数组作为一个整体不能作为赋值的对象。可以把数组名赋值给一个指针。

char a[4][6]的定义表示a是一个包含4个元素的数组,每个元素是一个char类型的指针。

数组名被改写成一个指针参数不是递归的,数组的数组会被改写成“数组的指针”而不是“指针的指针”。

实参                                                                所匹配的形式参数

数组的数组 char c[8][10];                                           char (*)[10];  数组的指针

指针数组  char * c[15];                                               char**c;  指针的指针

数组指针  char (*c)[64];                                                  不改变

指针的指针 char **c ;                                                     不改变

使用指针向函数传递一个多维数组:

1.一维数组:没有问题,但需要包括一个计算数值或者一个能标识越界位置的结束符。

2.二维数组:不能直接传递函数,但是可以将矩阵改写成一个一维Iliffle向量。并使用相同的下标表示方法,对字符串可以这么做,对其他的类型需要增加一个记数值或者标识越界位置的结束符。同样他依赖于调用函数和被调用函数之间的约定。

3.多维数组:都无法使用,必须分解成几个更少的数组。

不能从函数中返回一个指向函数局部变量的指针。

库函数realloc()能够对一个现在的内存块大小进行重新分配,通常是使之扩大,同时不丢失原先的内存块内容,当需要在动态链表中增长一个项目时,可以进行如下操作:

1.对表进行检查,看是否真的已经满了。

2.若确实已满使用realloc()扩展表的长度,并进行检查,确保realloc()操作成功进行。

3.在表中增加所需要的项目。

用代码表示大致如下:

int current_element = 0;

int total_element = 128;

char * dynamic = malloc(total_elememt);

void add_element(char c)

{

if (current_element == total_element - 1)

{

total_element * = 2;

dynamic = (char *)realloc(dynamic,total_element);

if(dynamic == NULL)

error ("Couldn't expand the table");

}

current_element ++;

dynamic[current_element] = c;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于PyTorch的Embedding和LSTM的自动写诗实验LSTM (Long Short-Term Memory) 是一种特殊的循环神经网络(RNN)架构,用于处理具有长期依赖关系的序列数据。传统的RNN在处理长序列时往往会遇到梯度消失或梯度爆炸的问题,导致无法有效地捕捉长期依赖。LSTM通过引入门控机制(Gating Mechanism)和记忆单元(Memory Cell)来克服这些问题。 以下是LSTM的基本结构和主要组件: 记忆单元(Memory Cell):记忆单元是LSTM的核心,用于存储长期信息。它像一个传送带一样,在整个链上运行,只有一些小的线性交互。信息很容易地在其上保持不变。 输入门(Input Gate):输入门决定了哪些新的信息会被加入到记忆单元中。它由当前时刻的输入和上一时刻的隐藏状态共同决定。 遗忘门(Forget Gate):遗忘门决定了哪些信息会从记忆单元中被丢弃或遗忘。它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 输出门(Output Gate):输出门决定了哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。同样地,它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 LSTM的计算过程可以大致描述为: 通过遗忘门决定从记忆单元中丢弃哪些信息。 通过输入门决定哪些新的信息会被加入到记忆单元中。 更新记忆单元的状态。 通过输出门决定哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。 由于LSTM能够有效地处理长期依赖关系,它在许多序列建模任务中都取得了很好的效果,如语音识别、文本生成、机器翻译、时序预测等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值