-
#include
void main()
int i,j,r,l;
float num[50][50],num1[50][50];
printf("请输入数组中的行数:");
scanf("%d",&r);
printf("请输入数组的列数:");
scanf("%d",&l);
for(i=0;ifor(j=0;jprintf("请输入列数 %d、列 d:",i+1,j+1);
scanf("%f",&num[i][j]);
转置*
for(i=0;ifor(j=0;jnum1[i][j]=num[j][i];
*printf("转调前:");
for(i=0;ifor(j=0;jprintf("%.3f ",num[i][j]);
printf("");
printf("");
*printf("转置后:");
for(i=0;ifor(j=0;jprintf("%.3f ",num1[i][j]);
printf("");
如果您有任何错误,请查看。
-
#include
int main()
int i,j,r,l;
float num[10][10],num1[50][50];
printf("请输入数组中的行数:");
scanf("%d",&r);
printf("请输入数组的列数:");
scanf("%d",&l);
for(i=0;ifor(j=0;jprintf("请输入列数 %d、列 d:",i+1,j+1);
scanf("%f",&num[i][j]);
转置*
for(i=0;ifor(j=0;jnum[i][j]=num1[j][i];
* for(i=0; ifor(j=0;jprintf("%f",num[i][j]);
printf("");
转置后 * for(i=0; ifor(j=0;jprintf("%f",num1[i][j]);
printf("");
一个小问题。
for(i=0;ifor(j=0;jscanf("%f",&num[i][j]);
-
1 2 3 4
a[0][0]=1,a[0][1]=2,a[0][2]=3,a[0][3]=4
a[1][0]=6,a[1][1]=6,a[1][2]=7,a[1][3]=8
a[2][0]=6,a[2][1]=4,a[2][2]=5,a[2][3]=7
你应该一一标记它们,不要犯错误,你没有彻底阅读这本书,这本书有这方面的所有知识,仔细阅读这本书。 一旦你读了这本书,你就会明白。
-
你的理解是正确的,书中的说法是错误的。
-
试着解释一下:
int i[3] = ;我相信你明白它只是 3 个整数,一个接一个地在内存中。
假设有一个名为 mytype 的类型,它占用 12 个字节。 然后我们还可以定义一个数组。
mytype a[2] = ;
它只是两个mytype,一个接一个地在内存中。
所以我现在告诉你,我需要第二个 mytype 指针,它显然应该是 &a[1],或者 a+1,对吧? 什么是 a[1] 或 *(a+1)? 当然是 MyType。
好了,现在让我们明确一下,这个 mytype 与前面的数组 i 相同,所以定义是:
int a[2][3] = ;
如何理解? a[1] 它是什么? 当然,它是一个 int [3],即三个整数的数组,我们可以添加一个双括号来取其中单个元素的值,即 a[1][0] 到 a[1][2] 表示 4、5、6
现在你应该明白,a[1] 也被视为一个地址,对吧? a[1] 也可以写成 *(a+1)。
等等,a+1 和 * (a+1) 都是地址,那么它们是一样的吗? 我告诉你,他们的价值观是一样的,如果你不相信,你可以打印出来看看。 但是,它们的意思并不相同,如果将 1 加到它们上,则编译器将 a+1+1 处理为 a+2,即 &a[2],这简直是越界的。
但是 *(a+1)+1 被编译器处理为 a[1]+1,即 &a[1][1],它指向第二个数组的第二个元素 (5)。
所以总结一下,它们都是地址,但编译器知道它们的含义不同,增量也不同。
-
不理解的主要原因是数组名称和指针之间的区别不清楚。 这两者不是一回事。
二维数组是一个连续空间,例如 int a[3][4] 那么 a 是 3*4 连续空间的名称。
所以 sizeof(a) 是这个空间的大小,int **p; 指示 p 是一个指针,它指向指针数组。
sizoef(p) 查找指针 p(实际上是一个整数)占用的空间量。
当数组名称用于传递值时,它是数组的第一个地址,因此许多人将数组名称与指针 a == &a 混淆;没错,因为 a 是一个空格的名称,左边是 a 的 p == &p;不对。
从上面,您可以大致知道数组名称和指针之间的区别。
int *p = ;这是一个指针数组,其中的元素是指针!!
int **q = q;合法。
int a[3][4];二维数组。
q = a;非法。
-
您将包含四个 int 的一维数组视为一种类型,例如 int4
那么 int a[3][4] 是 int4 a[3],那么 a 是 int4 地址,p 是 int* 地址。
-
只有二级指针和二维数组,还有二维指针! 也许我没知道 *是指向地址字符的指针,而您定义的 int **p 是定义指针 *p;
p=a 中的 a 表示数组 a 的第一个地址! 因此,*p=a 是合法的,这是不合法的。
-
谭浩强的书说得很清楚。 翻转它。
-
int* p=a;这对当前的编译器无效,a 的类型是 int(*)4],并且与 p 的类型不同,一些旧的编辑器。
像 Turbo C 类型检查这样的翻译器并不严格,可以使用。
int* p=a[0];这是有效的,但它不符合你的意图,例如,如果你想访问 a[1][1],你只能使用 p[5],而不能使用 p[1][1],并且这个指针 p 将 a 视为具有 12 个元素的一维数组,而不是具有 3 行和 4 列的矩阵。
正确的做法是:
int (*p)[4]=a;
如果要使用指针来引用数组,则指针的类型应定义为数组第一个元素的地址类代码日历。
比如。 int a[3]=;a 的元素是 int,元素地址类是 int*,那么你可以定义一个 int 指针来引用 a:
int*p=a;
而。 int[3][4];a 的元素是 int[4],它是 4 个 int 的数组,地址类型是 int(*)4],那么这个指针定义为:
int (*p)[4]=a;
-
我都试过了,但我不知道有什么区别。 袜子。
其次,对于数组,指针是数组的名称,它指向数组的第一个地址,一般不使用指向数组的指针。
再次,对于恒东来说,要刺激标准,或者采取这种分配方式:
int a[3][4]=,
-
1. name[num][10] 表示一行 num(10) 中 10 列的数组,num 代表 10 人,后面的 10 表示 name 字符串的长度(最长的是 9,后面系统会自动添加。'\0')
2. 不能使用一维数组定义名称,因为它是字符类型的数组,并且名称包含多个字符。 一维数组只能包含一个名称。
3. STMP 是一个存储字符串的一维数组。 它不用于存储 10 个人的名字,而只是作为字符串交换的临时变量。
-
根据上图,*(a+0)+1) a[0][1]。
数字的优先级高于数字的优先级,因此 *(*a+1)) 并非您错误地认为的情况。
优先级表可以在这里找到。
-
*(*a+0)+1) 相当于 *(*a+1),毕竟 a+0=a。 所以后者也意味着 a[0][1]。
这显然是一个二维数组,二维数组可以看作是一维数组,for(i = 0; ifor(j = 0; j < n; j++)printf("%d",a[i][j) >>>More
new 是 C++ 中动态应用于堆内存的函数。
如果你想在 C 语言中使用 malloc,它包含在头文件 stdlib 中。 >>>More
由于编译器默认为 16 基数写入的整数(如 0x40a80000),因此您无法这样做。 因此,不可能实现您的愿景。 如果必须以十六进制形式分配浮点数,则必须以其他方式执行。 >>>More