- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图更深入地学习C。我已经写了下面显示的代码。
#include "includes.h"
int main() {
char *array[1];
array[0] = "cloud";
char *ll[1];
ll[0] = array[0];
int n = 20, *pointer; // actual and pointer decaration
pointer = &n; // assign the memory address of int n to pointer
printf("the address of the variable in pointer is: %x\n", pointer);
printf("the value of *pointer is %d\n", *pointer);
printf("the value of &pointer is %x\n", &n);
//return 0;
// to access the value provided by a pointer, you would use *pointer
// accessing an array directly
printf("value of array[0] %s\n", array[0]);
printf("address of &array[0] %x\n", &array[0]);
// accessing array through the pointer ll
printf("value of *ll %s\n", *ll);
printf("address of ll %x\n", ll);
printf("pointer: %p\n", (void*) pointer); //inclusion from @chux
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#define DEF1 20
#define DEF2 2
[carl@sparknohss c]$ ./pointers.bin
the address of the variable in pointer is: 4a8c27dc
the value of *pointer is: 20
the value of &pointer is: 4a8c27dc
value of array[0]: cloud
address of &array[0]: 4a8c27f0
value of *ll: cloud
address of ll: 4a8c27e0
pointer: 0x7ffc4a8c27dc
[carl@sparknohss c]$
%x
提供的“ 0x7ffc”前缀以外,
%p
和
%x
有什么区别?有什么我可以深入研究的更好的解释资源吗?
最佳答案
我看到,至少在我看来,访问指向非数组的指针和访问指向数组的指针是有区别的。有没有人可以更详细地解释这一点?
处理数组和指针对象时存在一些差异。
将代码搁置一秒钟,假设您有声明
int arr[10];
arr
。它像这样在内存中布局:
+---+
arr: | | arr[0]
+---+
| | arr[1]
+---+
...
+---+
| | arr[9]
+---+
&arr[0]
)的地址将与整个数组对象(
&arr
)的地址相同。表达式
&arr[0]
和
&arr
将具有相同的值,但是它们的类型将有所不同-
&arr[0]
的类型将为“指向
int
的指针”(
int *
),而
&arr
的类型将是“指向
int
的10个元素的数组的指针”(
int (*)[10]
)。
sizeof
或一元
&
运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,即类型为“
T
的数组”的表达式“将被转换(” decay“)为” pointer to
T
“类型的表达式,该表达式的值将为数组第一个元素的地址。
arr
也将求值为数组的第一个元素的地址,就像
&arr[0]
和
&arr
一样;它从“由10个元素组成的
int
数组”类型“衰减”到“指向
int
的指针”(与
&arr[0]
相同)。
int *ptr;
ptr
不能为您提供与
&ptr
相同的值-可以为您提供
ptr
中存储的任何值。
array[0] = "cloud";
"cloud"
本身是一个数组表达式-类型为“
char
的6元素数组”(计算0终止符)。由于它不是
sizeof
或一元
&
运算符的操作数,也不用于初始化声明中的另一个数组,因此该表达式将从类型“
char
的数组”转换为“指向
char
声明为
array
的数组,因此可以使用;
char *
的类型是
array[0]
。
char *
定义为
a[i]
-给定一个地址值,从该地址偏移
*(a + i)
个元素(不是字节)并取消引用结果。这是B编程语言的保留,它是C的来源,并且在设置数组对象时在内部使用了指针。 C摆脱了内部指针,但保留了下标的语义。因此,要使
i
在C中工作,首先必须将
a[i]
转换为指针值。请注意,这意味着您可以对指针类型使用
a
运算符-
[]
和
pointer[0]
将为您提供相同的结果(
*pointer
所指向的值)。
printf( "&array[0] = %p\n", (void *) &array[0] );
printf( "array = %p\n", (void *) array );
printf( "&array = %p\n", (void *) &array );
pointer
第一个元素的地址。如果您打印出表达式
printf( "array[0] = %p\n", (void *) array[0] );
array
字符串文字的第一个字符的地址。
printf( "array = %s\n", array );
"cloud"
。请记住,
cloud
转换说明符希望其对应的参数是指向
%s
的指针,并且它将打印从该地址开始的字符序列,直到看到0终止符为止。
printf( "*array[0] = %c\n", *array[0] );
char
-
c
字符串中的第一个字母。请注意,
"cloud"
与
*array[0]
相同。要打印
array[0][0]
,您需要编写
printf( "array[0][1] = %c\n", array[0][1] );
printf( "pointer = %p\n", (void *) pointer );
printf( "&pointer = %p\n", (void *) &pointer );
l
不是数组对象。
pointer
期望其对应的参数具有类型
%x
,并以十六进制格式设置输出。
unsigned int
期望其对应的参数具有类型
%p
,并以实现定义的方式格式化输出(通常为十六进制,但不一定必须如此)。
void *
(或
%x
以外的任何其他东西)来打印出指针值。一方面,指针值可能比
%p
宽(这在我的系统上是正确的),因此输出可能会出现乱码。
关于c - 使用指针访问数组和通过指针访问非数组变量之间有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39400217/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How to nest OR statements in JavaScript? 有没有办法做到这一点:
在 JavaScript 中有没有办法让一个变量总是等于一个变量?喜欢var1 = var2但是当var2更新,也是var1 . 例子 var var1 = document.getElementBy
我正在努力理解这代表什么 var1 = var2 == var3 我的猜测是这等同于: if (var2 == var3): var1 = var2 最佳答案 赋值 var1 = var2
这个问题已经有答案了: What does the PHP error message "Notice: Use of undefined constant" mean? (2 个回答) 已关闭 8
我在临时表中有几条记录,我想从每条记录中获取一个值并将其添加到一个变量中,例如 color | caption -------------------------------- re
如何将字符串转为变量(字符串变量--> $variable)? 或者用逗号分隔的变量列表然后转换为实际变量。 我有 2 个文件: 列名文件 行文件 我需要根据字符串匹配行文件中的整行,并根据列名文件命
我有一个我无法解决的基本 php 问题,我也想了解为什么! $upperValueCB = 10; $passNodeMatrixSource = 'CB'; $topValue= '$uppe
这可能吗? php $variable = $variable1 || $variable2? 如果 $variable1 为空则使用 $variable2 是否存在类似的东西? 最佳答案 PHP 5
在 Perl 5.20 中,for 循环似乎能够修改模块作用域的变量,但不能修改父作用域中的词法变量。 #!/usr/bin/env perl use strict; use warnings; ou
为什么这不起作用: var variable; variable = variable.concat(variable2); $('#lunk').append(variable) 我无法弄清楚这一点
根据我的理解,在32位机器上,指针的sizeof是32位(4字节),而在64位机器上,它是8字节。无论它们指向什么数据类型,它们都有固定的大小。我的计算机在 64 位上运行,但是当我打印包含 * 的大
例如: int a = 10; a += 1.5; 这运行得很完美,但是 a = a+1.5; 此作业表示类型不匹配:无法从 double 转换为 int。所以我的问题是:+= 运算符 和= 运算符
您好,我写了这个 MySQL 存储过程,但我一直收到这个语法错误 #1064 - You have an error in your SQL syntax; check the manual that
我试图在我的场景中显示特定的奖牌,这取决于你的高分是基于关卡的目标。 // Get Medal Colour if levelHighscore goalScore { sc
我必须维护相当古老的 Visual C++ 源代码的大型代码库。我发现代码如下: bIsOk = !!m_ptr->isOpen(some Parameters) bIsOk的数据类型是bool,is
我有一个从 MySQL 数据库中提取的动态产品列表。在 list 上有一个立即联系 按钮,我正在使用一个 jquery Modal 脚本,它会弹出一个表单。 我的问题是尝试将产品信息变量传递给该弹出窗
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
jQuery Core Style Guidelines建议两种不同的方法来检查变量是否已定义。 全局变量:typeof variable === "undefined" 局部变量:variable
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: “Variable” Variables in Javascript? 我想肯定有一种方法可以在 JavaScrip
在语句中使用多重赋值有什么优点或缺点吗?在简单的例子中 var1 = var2 = true; 赋值是从右到左的(我相信 C# 中的所有赋值都是如此,而且可能是 Java,尽管我没有检查后者)。但是,
我是一名优秀的程序员,十分优秀!