关于指针数组
小甲鱼在指针数组那一讲说了“应该将数组的地址传给数组指针,而不是传递数组第一个元素的地址,尽管他们的值是相同的,但含义却不一样”那么在指向指针的指针这一讲,为什么是把array赋值给p这个数组指针,而不是&array呢?代码如下:
#include <stdio.h>
int main()
{
int array = {
{0, 1, 2, 3},
{4, 5, 6, 7},
{8, 9, 10, 11}};
int (*p);
int i, j;
p = array;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
printf("%2d ", *(*(p+i)+j));
}
printf("\n");
}
return 0;
} 本帖最后由 jhq999 于 2021-11-5 21:51 编辑
飞花落尽 发表于 2021-11-5 21:19
嗯,这段代码理解了,但是能不能定义char类型(只是新手的好奇)就像上面一样,我的问题主要是这个:
“ ...
char *array = {"FishC","Five","Star","Good","WoW"};//这不就是指针的数组,char (*array);是数组的指针,不是一个类型 应该将数组的地址传给数组指针,而不是传递数组第一个元素的地址,尽管他们的值是相同的,但含义却不一样
这个 含义却不一样,指的就是类型不一样
现在等于号左边的类型是 int (*),等于号右边的类型也是 int (*)
所以 p = array; 没问题,加了取地址符号反而类型不对了 人造人 发表于 2021-11-5 19:25
应该将数组的地址传给数组指针,而不是传递数组第一个元素的地址,尽管他们的值是相同的,但含义却不一样
...
加了取地址符后array的类型是什么呢? 人造人 发表于 2021-11-5 19:25
应该将数组的地址传给数组指针,而不是传递数组第一个元素的地址,尽管他们的值是相同的,但含义却不一样
...
而且其实我纠结的是前半句“应该将数组的地址传给数组指针”,那么这句话是否错了呢?是不是两边等号类型相同,就不一定要求数组的地址呢? 本帖最后由 jhq999 于 2021-11-5 20:25 编辑
飞花落尽 发表于 2021-11-5 19:48
而且其实我纠结的是前半句“应该将数组的地址传给数组指针”,那么这句话是否错了呢?是不是两边等号类型 ...
int (*p);//首先(*p)告诉编译器的是p是个指针,后面的告诉编译器这个p是列的大小为4的二维数组的指针
也可以这样
int main()
{
int array = {
{0, 1, 2, 3},
{4, 5, 6, 7},
{8, 9, 10, 11}};
int (*p);
int i, j;
p = (int(*))(array);
for (i = 0; i < 4; i++)
{
for (j = 0; j < 3; j++)
{
printf("%2d ", *(*(p+i)+j));// printf("%2d ", p);
}
printf("\n");
}
return 0;
}
还可以这样
int main()
{
int array = {
{0, 1, 2, 3},
{4, 5, 6, 7},
{8, 9, 10, 11}};
int *p;
int i, j;
p = (int*)(array);
for (i = 0; i < 12; i++)
{
printf("%2d ",*(p+i));
}
return 0;
}
其实在内存里哪有多维数组全是一维数组; jhq999 发表于 2021-11-5 20:15
也可以这样
那按照这个逻辑,这个程序为什么运行之后是乱码呢?(不考虑数组越界先)
#include <stdio.h>
int main()
{
char *array = {"FishC","Five","Star","Good","WoW"};//不行,因为其本身就是指针类的二维数组
char (*array1) = array;
int i = 0,j;
for (i = 0;i < 5;i++)
{
for (j = 0;j < 5;j++)
{
printf("%c ",*(*(array1 + i)+ j));//取出数组的值本身就要加个*号
}
putchar('\n');
}
return 0;
} 本帖最后由 飞花落尽 于 2021-11-5 21:04 编辑
jhq999 发表于 2021-11-5 20:15
也可以这样
这样才能运行
#include <stdio.h>
int main()
{
char *array = {"FishC","Five","Star","Good","WoW"};//不行,因为其本身就是指针类的二维数组
char (*array1) = *array;
int i = 0,j;
for (i = 0;i < 5;i++)
{
for (j = 0;j < 5;j++)
{
printf("%c ",*(*(array1 + i)+ j));//取出数组的值本身就要加个*号
}
putchar('\n');
}
return 0;
}
字符串型数组不就相当于二维数组吗?为什么还要多解一次引用,难不成他是三维数组?(我知道他在内存中都是一维的,这里先这么称呼他先) 本帖最后由 jhq999 于 2021-11-5 21:09 编辑
飞花落尽 发表于 2021-11-5 20:56
那按照这个逻辑,这个程序为什么运行之后是乱码呢?(不考虑数组越界先)
int main()
{
char *array = {"FishC","Five","Star","Good","WoW"};//这是个(char *) 类型的一维数组,里面是那些常数字符串的指针
char **array1 = array;
int i = 0,j;
for (i = 0;i < 5;i++)
{
printf("%s ",*(array1 + i));//取出数组的值本身就要加个*号
putchar('\n');
}
return 0;
} jhq999 发表于 2021-11-5 21:04
嗯,但是我现在想用数组指针指向他,请看这一段
#include <stdio.h>
int main()
{
char *array = {"FishC","Five","Star","Good","WoW"};
char (*array1) = *array;
int i = 0,j;
for (i = 0;i < 5;i++)
{
for (j = 0;j < 5;j++)
{
printf("%c ",*(*(array1 + i)+ j));
}
putchar('\n');
}
return 0;
}
在定义数组指针时为什么还要多一次解引用,按照上面代码
int (*) = array(array是二维数组)
char (*array1) = *array(如果把字符串也当成是指针类的话,这个array也是二维数组)
那么,为什么一个要解引用,一个不用解呢?(难不成是三维,按照解引用来定义) #include "stdafx.h"
int main()
{
char *array = {"FishC","Five","Star","Good","WoW"};//不行,因为其本身就是指针类的二维数组
char* (*array1) = &array;
int i = 0,j;
for (i = 0;i < 5;i++)
{
for (j = 0;*(*(*array1 + i)+ j);j++)
{
printf("%c ",*(*(*array1 + i)+ j));//取出数组的值本身就要加个*号
}
putchar('\n');
}
return 0;
} jhq999 发表于 2021-11-5 21:15
嗯,这段代码理解了,但是能不能定义char类型(只是新手的好奇)就像上面一样,我的问题主要是这个:
“在定义数组指针时为什么还要多一次解引用,按照上面代码
int (*) = array(array是二维数组)
char (*array1) = *array(如果把字符串也当成是指针类的话,这个array也是二维数组)
那么,为什么一个要解引用,一个不用解呢?(难不成是三维,按照解引用来定义)” jhq999 发表于 2021-11-5 21:15
就是这一段
#include <stdio.h>
int main()
{
char *array = {"FishC","Five","Star","Good","WoW"};
char (*array1) = *array;
int i = 0,j;
for (i = 0;i < 5;i++)
{
for (j = 0;j < 5;j++)
{
printf("%c ",*(*(array1 + i)+ j));
}
putchar('\n');
}
return 0;
} jhq999 发表于 2021-11-5 21:28
这个p和array不是一样的都是指针数组吗? jhq999 发表于 2021-11-5 19:09
谢谢 jhq999 发表于 2021-11-5 21:15
诶,怎么最佳答案不见了,想问一下什么叫把他们的指针存在数组单元中,字符串不是一个数组吗?他的指针是怎么来的? jhq999 发表于 2021-11-5 21:15
所以说字符串是一个指针存在数组单元的东西吗? 本帖最后由 jhq999 于 2021-11-5 22:19 编辑
飞花落尽 发表于 2021-11-5 22:07
诶,怎么最佳答案不见了,想问一下什么叫把他们的指针存在数组单元中,字符串不是一个数组吗?他的指针是 ...
"FishC","Five","Star","Good","WoW"都属于字符串常量
百度:
字符串常量定义:用双引号(“”)括起来的0个或者多个字符组成的序列。
在程序中,字符串常量会生成一个“指向字符的常量指针”。当一个字符串常量出现于一个表达式中时,表达式所使用的值就是这些字符所存储的地址,而不是这些字符本身。因此,你可以把字符串常量赋值给一个“指向字符 的指针”,例如:char *a = "123" ; a = "abc";,后者指向这些字符所存储的地址。但是,你不能把字符串常量赋值给一个字符数组,因为字符串常量的直接值是一个指针,而不是这些字符本身。例如:char a;a = "a";就是错误的,报错结果:invalid conversion from 'const char*' to 'char'。
例如:char a="love",的意思就是用字符串“love”来初始化字符数组a的内存空间,
而数组的首地址也就是“love”字符串的地址。//感觉这句话有错误 jhq999 发表于 2021-11-5 22:13
"FishC","Five","Star","Good","WoW"都属于字符串常量
百度:
字符串常量定义:用双引号(“”)括起来 ...
勉强懂个大概,找书看去了,谢谢大佬
页:
[1]