C语言中c【i】是地址吗?&c【i】就是地址。那到底咋用?

哎呀,我以前确实遇到过这个麻烦。
记得那时,我刚学C语言。
那是2 01 2 年,我还在上大学。
当时我写了一个程序打印数组元素的地址,但结果是 printf("%p", C[i]); 我想知道为什么打印的地址都是连续的,我以为C[i]就是地址。
后来咨询老师才知道C[i]是数组元素,而不是地址。
您需要使用 & 符号来获取地址。
当时觉得很尴尬,但现在想来,还蛮好笑的。
后来我想起来C[i]和&C[i]是不同的。
一个代表内容,另一个代表地址。
我在这方面受过很多苦。

C语言中的二维数组里a+1和*(a+1)为什么都是地址

上周 你说的有点绕。

a+1 实际上指向下一行的首地址。

(a+1 ) 是下一行的首地址。

行多数和列多数的计算方法不同。

你的公式是正确的。

存储单元数量的公式也是正确的。

但我的例子更简单。

算了。

c语言全面解析十个知识点大学生谨记

说实话,这个索引有点混乱,但是一旦掌握了要点就很容易理解。
当我看到这些标志时,我完全困惑了。
现在我给你一个提示。

1 .指针是存储地址的变量。
区间 a = 1 0, n;这行代码中,p是一个指针变量,专门用来存储地址。
当时我不明白为什么指针也要定义类型(例如int)。
后来我意识到编译器必须知道要存储什么类型的地址,否则值会混淆。

2 一个指针指向一个变量 p = &a;通过这行代码,编译器将告诉您 p 现在指向 a。
事实上,p存储的是a的内存地址,例如0x1 000。
这非常重要,因为所有指针操作都是基于地址的。

3 定义和调用是有区别的 我以前经历过这个。
积分=1 0,r;这里的意思是p是一个指针变量。
但p=p+1 ;这里的解引用,意思是“将p(即a)指向的变量加1 ”。
如果你想一想,如果你感到困惑,代码就会变得混乱。

4 自我膨胀的几种情况 p++ 和 (p)++ 不是同一件事。
p++ 将指针向后移动一个单位(例如,p++ 指向数组的下一个元素),(p)++ 将当前指针指向的值加 1 当我写代码的时候,我经常混淆这两个概念,结果调试就到了天涯海角。

5 指针数组和二维数组名称 int a[3 ][2 ], p[3 ];其中p是一个指针数组,每个元素存储一个地址。
二维数组名a也是一个地址,但不是指针,所以不能直接赋值给p。
您必须逐行复制,例如使用 for 循环将每行的首地址存储在 p 中。

6 传递函数地址的酷操作 我记得在一次采访中被问到哪个更快:传递指针还是按值传递。
答案可能是按值传递,因为编译器将进行优化。
但是传递指针可以改变调用者的变量,这是非常实用的。
例如,如果您正在编写替换函数,则可以使用指针交换两个数字。

7 陷阱时通过二维数组传递参数 fun(int a[3 ][2 ]) 和 fun(int (a)[2 ]) 看起来一样,但实际上是不同的。
第一个按行传递参数,第二个按列传递参数。
我在写代码的时候,遇到过一个二维数组传递参数的时候直接崩溃的情况。
最后我发现类型不一样。

8 关于指针和数组的一些知识 数组名是一个地址常量,不能像指针一样递增。
但 int a[1 0], p=a;这行代码是有效的,因为p指向a的首地址。
所以 a[i] 和 (a+i) 是允许的,但 a++ 是不允许的。

9 指针数组的有趣操作 int p[3 ], a[3 ][2 ]; p[0]=a[0];这行代码是有效的,因为a[0]是二维数组的起始地址。
但 p=a 是不正确的,因为 a 是数组名,而不是指针。

1 0传递自定义函数参数 fun(int a[M]) 和 fun(int a) 看起来相同,但编译器区分它们。
第一个是定长数组,第二个是变长指针。
我在写代码的时候就遇到了这种参数传递的问题,最后发现是函数声明和调用类型不一样。

总的来说,指针就是内存地址的魔力。
如果你用得好,你可以做很多有趣的事情,但如果你用得不好……哈哈,调试会让你质疑你的生活。