在下面的代码中,指针值和指针地址按预期不同.
但数组值和地址不行!
怎么会这样?
产量
my_array = 0022FF00
&my_array = 0022FF00
pointer_to_array = 0022FF00
&pointer_to_array = 0022FEFC
Run Code Online (Sandbox Code Playgroud)
#include <stdio.h>
int main()
{
char my_array[100] = "some cool string";
printf("my_array = %p\n", my_array);
printf("&my_array = %p\n", &my_array);
char *pointer_to_array = my_array;
printf("pointer_to_array = %p\n", pointer_to_array);
printf("&pointer_to_array = %p\n", &pointer_to_array);
printf("Press ENTER to continue...\n");
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我在许多帖子中都看到"在大多数情况下,数组名称会衰减为指针".
我可以知道在什么情况下/数组名称表达式不会衰减成指向其第一个元素的指针吗?
在编写一个简单的函数来从字符串中删除特定字符时,我遇到了这个奇怪的问题:
void str_remove_chars( char *str, char to_remove)
{
if(str && to_remove)
{
char *ptr = str;
char *cur = str;
while(*ptr != '\0')
{
if(*ptr != to_remove)
{
if(ptr != cur)
{
cur[0] = ptr[0];
}
cur++;
}
ptr++;
}
cur[0] = '\0';
}
}
int main()
{
setbuf(stdout, NULL);
{
char test[] = "string test"; // stack allocation?
printf("Test: %s\n", test);
str_remove_chars(test, ' '); // works
printf("After: %s\n",test);
}
{
char *test = "string test"; // non-writable?
printf("Test: %s\n", …
Run Code Online (Sandbox Code Playgroud) 在我的代码中:
char *str[] = {"forgs", "do", "not", "die"};
printf("%d %d", sizeof(str), sizeof(str[0]));
Run Code Online (Sandbox Code Playgroud)
我得到了输出12 2
,所以我怀疑是:
str
和str[0]
是字符指针,对不对?1) 误解:
每当用C语言声明数组时,都会隐式创建指向数组第一个元素的指针(数组的名称).(是吗?我不这么认为!)
这个页面的前两行(虽然我不确定信息的正确性)说明相同.
正如我们所看到的,当我们声明一个数组时,为数组的单元分配了一个连续的内存块,并且还分配了一个指针单元(适当类型)并初始化为指向数组的第一个单元.
但是,当我输出包含的地址在该指针和地址的该指针,就变成是相同的.所以,我认为毕竟不会创建指针.
任何人都可以详细解释编译器何时决定将数组名称转换为指针,为什么?
PS:请解释一下功能.此外,在这个环节中,已经给出,说是一个函数int square(int,int)
,任意 square
,&square
,*square
,**square
是指同一个函数指针.你可以解释吗?
编辑:代码段
int fruits[10];
printf("Address IN constant pointer is %p\n", fruits);
printf("Address OF constant pointer is %p\n", &fruits);
Run Code Online (Sandbox Code Playgroud)
输出:
Address IN constant pointer is 0xbff99ca8
Address OF constant pointer is 0xbff99ca8
Run Code Online (Sandbox Code Playgroud) 我是编程新手.我正在学习C作为我的第一门编程语言.我发现一些奇怪的东西要理解.
我已经知道在C中我们可以将String表示为像这样的字符序列(使用char数组):
char status[10] = "Married";
Run Code Online (Sandbox Code Playgroud)
我已经了解到这种方法的问题是我们必须status
在编译期间告诉数组的大小.
但是现在我已经知道我们可以使用char
指针来表示string
类似 -
char status[10] = "Married";
char *strPtr;
strPtr = status;
Run Code Online (Sandbox Code Playgroud)
我不理解它.我的问题是 -
我怎样才能在索引4(即我在Married)中使用strPtr
?
在数组表示的末尾status
有一个空字符(\0
)- - - - - - - .因此,通过使用null字符(),我们可以理解字符串的结尾.当我们使用时,我们怎样才能理解结束?string
char
M
a
r
r
i
e
d
\0
\0
strPtr
string
#include <stdio.h>
int main(void){
char array[20];
printf( "\nSize of array is %d\n", sizeof(array) ); //outputs 20
printf("\nSize of &array[0] is %d\n", sizeof(&array[0]); //output 4
}
Run Code Online (Sandbox Code Playgroud)
上面的代码给出了20
for sizeof(array)
和4
for sizeof(&array[0])
.
我所知道的不是将数组作为参数,而是可以传递它的第一个元素.他们不应该给出与20相同的输出吗?为什么&array[0]
给出4作为结果?据我所知,char存储在1个字节中?
我知道一个数组衰减到指针,如果一个声明
char things[8];
Run Code Online (Sandbox Code Playgroud)
然后在things
其他地方使用,things
是一个指向数组中第一个元素的指针.
另外,根据我的理解,如果有人宣称
char moreThings[8][8];
Run Code Online (Sandbox Code Playgroud)
那么moreThings
它不是指向char的类型指针,而是类型为"指向char的指针数组",因为衰减只发生一次.
什么时候moreThings
传递给一个函数(比如说原型void doThings(char thingsGoHere[8][8])
实际上是什么进行了堆栈?
如果moreThings
不是指针类型,那么这仍然是一个传递引用?我想我一直认为它moreThings
仍然代表了多维数组的基地址.如果doThings
接受输入thingsGoHere
并将其传递给另一个函数会怎么样?
规则几乎是除非指定数组输入,const
然后数组将始终可修改?
我知道类型检查的东西只发生在编译时,但我仍然对技术上作为一个引用传递的东西感到困惑(即只有当传递类型指针的参数时,或者指针数组是否为传递 - 参考也是?)
很抱歉这个问题在这个地方有点儿,但由于我很难理解这一点,很难说出一个精确的询问.
所以,我正在阅读有关指针的内容,并且遇到了指向数组的指针.问题是指向数组的指针根本不是真的有用,因为我可以直接获取元素,而不是使用指针来获取数组元素的偏移量.但是我觉得好像我错过了这些可能有用的原因.
所以,简而言之,指向数组的重点是什么; 如何以及为什么要使用它们,它们是否有任何实际应用?
编辑:我的意思是在普通/简单数组的上下文中,例如:
int array[5];
Run Code Online (Sandbox Code Playgroud)
编辑:正如Keith指出的那样,我特别询问指向数组的指针,例如char (*ptr)[42]
指向42个元素的char数组的指针.
此代码示例正确打印数组.
int b[2] = {1, 2};
int *c = &b;
int i, j,k = 0;
for (i = 0;i < 2; i++) {
printf("%d ", *(c+i));
}
Run Code Online (Sandbox Code Playgroud)
而这个打印两个垃圾值.
int b[2] = {1, 2};
int i, j,k = 0;
for (i = 0;i < 2; i++) {
printf("%d ", *(&b+i));
}
Run Code Online (Sandbox Code Playgroud)
为什么两个代码示例的行为不同?