日志

要点1:指针、数组和复合字面量

 来源    2020-08-02    0  

一维数组及其指针表示法

一维数组:

int ar[] = {1,2,3}    // 直接初始化,编译器自动获取数组大小
int br[3] = {1,2,3}   // 直接指定大小

数组的名字ar其实是一个指针:

int *pr = ar;
printf("%d\n", pr == ar);  // true
printf("%d\n", pr+1 == &ar[1]);  // true

所以可以通过指针的方式访问数组:

printf("%d\n", *(ar+1));  //  2

二维数组及其指针表示法

二维数组:

int ar[][3] = {{1,2,3},{4,5,6}};    // 直接初始化,编译器自动识别大小
int br[2][3] = {{1,2,3},{4,5,6}};  // 初始化时,显示指定大小

注意,定义多维数组的时候,只有第一个[]中可以省略长度,其他都要显示的指定,因为通过ar+1的形式获取第二个元素的地址的时候,需要知道每个元素的长度.

这里的ar和br其实是一个包含2个指针元素的数组,每个指针都指向一个大小为3的int型数组,故可以用如下方式访问:

int (*pr)[3] = ar;     // 定义一个指针,类型为int [3],这里要区别于int *pr[3]
printf("%d\n", *(*(pr+1)+1));   // *(pr+1)可以取出第2个数组的首地址,所以输出 5

复合字面量

在C99标准以前,对于带数组形参的函数,情况不同,可以传递数组,但是没有等价的数组常量。C99新增了复合字面量(compound literal)。字面量是除符号常量外的常量。例如,5是int类型字面量,81.3是double类型的字面量,'Y'是char类型的字面量,"elephant"是字符串字面量。

下面创建数组的方式和上面创建一维数组的方式等价:

int *pr;
pr = (int [3]){1,2,3};   // C99之前是不允许的

这样在形参带数组的函数中传参更方便:

void sum(const int [], int n);
int s = sum((int []){1,2,3}, 3);

二维的复合字面量可以这么用:

int (*pr)[3];
pr = (int [][3]){{1,2,3},{4,5,6}};   // 和传统二维数组定义方式等价,更方便
相关文章
C语言复合字面量的使用
日志C99添加的特性,复合字面量(composite literal).一旦熟悉并使用,便会体会到简洁强大的表达. 所谓字面量就是固定数值的表示.数值和字符串类型都有字面量的表达.如: // 100, 1 ...
1
char型指针和字符串字面量和字符数组
日志1.当一个char型指针指向一个字符串字面量(也就是常量字符串)时,该指针必须由const修饰,否则,系统会给出deprecated(不赞成)的警告.原因是:字符串字面量不可改变,当它被一个非cons ...
JavaScript对象的理解 及 字面量对象与数组的关系
日志JavaScript的简单类型包括 数字.字符串.布尔值.null值.undefined值. 其他的值都是对象.对象是可变的键控集合.数组.函数.正则表达式都是对象. 对象是属性的容器,属性都是名字和 ...
javascript中对象字面量与数组字面量
日志第一部分 我们知道JavaScript中的数据类型有基本数据类型和引用类型,其中Object类型就是非常常用的类型.那么如果创建一个Object类型的实例呢?下面我介绍两种方法: 第一:构造函数法. ...
[Effective JavaScript 笔记]第52条:数组字面量优于数组构造函数
日志js的优雅很大程序要归功于程序中常见的构造块(Object,Function及Array)的简明的字面量语法.字面量是一种表示数组的优雅方法. var a=[1,2,3,5,7,8]; 也可以使用构造 ...
1
c – 指向字符串的指针数组
问答在C编程中,我们无法使用scanf()函数获取值到指针数组 int main() { char *names[6]; int loop; scanf("%s",names[1]); ...
1
c – 使用字符串数组:指针数组 – 它们是否像多维数组?
问答我最近一直在为C傻瓜读C,或者标题是用词不当或他们没有指望我.在关于利用带有字符串的指针数组的部分中,它们显示了一个函数,我已经完全难以理解并且不知道在哪里转动. char* int2month(in ...
PostgreSQL – INSERT包含数组的复合类型数组
问答我有一个包含TEXT等数组的复合类型.我在我的主表中使用它来创建一个复合类型的数组. 如何生成INSERT命令(不使用复合类型的默认字段名称)?我可以使用复合数组创建TEMPORARY TABLE,然 ...
1
在CUDA中,如何将设备指针数组复制到设备内存?
问答例如,我分配以下指针: float *data_1, *data_2, *data_3, *data_4; //Use malloc to allocate memory and fill out s ...
1
数组 – 将指针数组复制到设备内存和后端(CUDA)
问答我试图在我的玩具示例中使用cublas函数cublasSgemmBatched.在这个例子中,我首先分配2D数组:大小为[6] [5]的h_AA,h_BB和大小为[6] [1]的h_CC.之后我将其复 ...
1
c – 复制复制构造函数中唯一指针数组的内容
问答我的类包含一个指向数组的唯一指针.当调用复制构造函数时,我希望该类创建自己的唯一指针数组,并只复制旧的唯一指针数组的内容.我一直有关于从const值转换的错误,我不知道如何绕过它. 我的指针在私有下声 ...
1
c++ 不建议将字符串字面量转换为字符*
问答在我的代码中,我不断收到错误"从字符串文字转换为字符*已被弃用".代码的目的是使用指针到指针来分配字符串1和字符串2,然后打印出来.如何解决这个问题? 这是我的代码: #inclu ...
1
c – 指针数组 – 外部问题
问答文件1.c int a[10]; 文件main.c: extern int *a; int main() { printf("%d\n", a[0]); return 0; } 给 ...
1
c++ 方括号数组和指针数组之间有什么区别?
问答作为非C/C++专家,我总是认为方括号和指针数组相等. 即: char *my_array_star; char my_array_square[]; 但是我注意到,当在一个结构/类中使用它们的行为不 ...
1
c – 创建指向类对象的指针数组
问答题: 创建一个至少有四个指向Reader对象的数组.使用New运算符创建至少四个指向派生类对象的指针并将它们分配给数组. 我不确定我是否做对了. Reader是基类.约翰,大卫,丹尼尔,马克是派生阶级 ...
1
释放已分配给char指针数组(字符串)的内存.我是否必须释放每个字符串或只是“主”指针?
问答我有一个函数,它接受一个指向char **的指针并用字符串填充它(我想是一个字符串数组). * list_of_strings *在函数内部分配内存. char * *list_of_strings ...
1
c – GCC和Clang都不会通过编译时已知的函数指针数组内联调用 – 为什么?
问答Compiler Explorer上的示例代码:https://godbolt.org/g/fPfw4k 我试图使用一组函数指针作为跳转表而不是开关,因为我发现它更干净.然而,令我惊讶的是,GCC和C ...
2
为什么在初始化一个函数指针数组时有一个“警告”?
问答我尝试初始化一个数组的函数指针,我有"警告": ring-buffer.c:57:19: warning: assignment from incompatible pointer ...
1
在C中创建指针数组的char *和int *数据类型有什么区别?
问答在为int数据类型创建指针数组时,以下代码可以正常工作: int var[] = {10, 100, 200, 1000}; int *ptr[] = {&var[0], &var[1 ...
2