go语言数组和指针 go语言数组和指针的区别( 二 )


即切片是一个抽象层 , 底层是对数组的引用 。
当我们使用
构建出来的切片的每个位置的值都被赋为interface类型的初始值nil,但是nil值也是有大小的 。
而使用
来进行初始化时,虽然生成的切片中不包含nil值,但是无法通过设置的指针变量来完成入队和出队的操作,只能使用append()函数来进行操作
在go语言中,切片是一片连续的内存空间加上长度与容量的标识 , 比数组更为常用 。使用 append 关键字向切片中追加元素也是常见的切片操作
正是基于此 , 在使用go语言完成循环队列时,首先想到的就是使用make(type, len, cap)关键字方式完成切片初始化,然后使用append()函数来操作该切片,但这一方式出现了很多问题 。在使用append()函数时 , 切片的cap可能会发生变化 , 用不好就会发生扩容或收缩 。最终造成的结果是一个四不像的结果,入队和出队操作变得与指针变量无关,失去了作为循环队列的意义,用在顺序队列还算合适 。
参考博客:
Go语言中的Nil
Golang之nil
Go 语言设计与实现
指针和数组的区别C++/C程序中,指针和数组在不少地方都是可以相互替换使用的,这就让人产生一种错觉,以为两者是等价的 。
数组或是在静态存储区被创建(全局数组) , 或是在栈上被创建 。数组名对应着,注意不是指向,一块内存,其地址与容量在生命期内保持不变(当然,使用了realloc()的不算),只有数组的内容可以改变 。
指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存 。指针远比数组灵活,当然也就更危险 。
区别之一:
char a[] = "hello";
a[0] = 'X';
coutaendl;
char *p = "world";// 注意p指向常量字符串
p[0] = 'X';// compiler不能发现该错误 , 不过在运行的时候会发生runtime error
coutpendl;
区别之二:
用运算符sizeof可以计算出数组的容量(字节数) 。比如对应上面的代码,sizeof(a)的值是12(包括最后面的'\0') 。指针p指向a,但是sizeof(p)的值却是4 。这是因为sizeof(p)得到的是一个指针变量的字节数,相当于sizeof(char*),而不是p所指的内存容量siziof(char[6]) 。C++/C不能知道指针所指的内存容量 。
值得注意的是 , 当数组作为函数的参数进行传递时,数组就自动退化为同类型的指针 。那么不论数组a的容量是多少,sizeof(a)始终等于sizeof(char *) 。
指针与数组的关系是什么啊1、指针:系统为某一个变量开辟单元格,指针便指向此单元格的变量值 。
2、数组:系统为某一组数开辟一组单元格,数组首地址便是你定义的数组变量名 。
数组和指针的唯一区别是,不能改变数组名称指向的地址 。
对于数组来说,数组的首地址,也可以用指针来表示操作,如:
int a[10];
int *p,n;
p = a;
对第一个元素取值,可以用几种方法:
n =a[0];
n = *p;
n = p[0];
n = *(p+0) ;
但是以下语句则是非法的:
readings = totals; // 非法!不能改变 readings totals = dptr; // 非法!不能改变 totals
数组名称是指针常量 。不能让它们指向除了它们所代表的数组之外的任何东西 。
扩展资料
下面的程序定义了一个 double 数组和一个 double 指针,该指针分配了数组的起始地址 。随后,不仅指针符号可以与数组名称一起使用,而且下标符号也可以与指针一起使用 。
int main()
{
const int NUM_COINS = 5;
double coins[NUM_COINS] = {0.05, 0.1, 0.25, 0.5, 1.0};