一、参数*&与*的区别
开辟空间时的区别:
(1)参数为*&address
typedef struct Anode{
int weight;
struct Anode *next;
}ANode;
void createAddress(Anode *&address){
address = (Anode *)malloc(sizeof(ANode));
}
int main(){
Anode *address;
createAddress(address);
return 0;
}
此时不会报错
(2)参数为*address
typedef struct Anode{
int weight;
struct Anode *next;
}ANode;
void createAddress(Anode *address){
address = (Anode *)malloc(sizeof(ANode));
}
int main(){
Anode *address;
createAddress(address);
return 0;
}
此时报错:指针address没有初始化。
总结
由于*&address取了address的地址,因此在void函数里开辟空间,相当于为主函数里的address开辟了空间,在void函数回收时不会被销毁;相反,*address因为没有取到address,因此在void函数回收时会被销毁,因此报错。
二、二维数组传递时列数不对等的区别
(1)传递二维数组的列数和参数中二维数组的列数相等时
#include <stdio.h>
void printA(int A[][3]){
int i, j;
printf("----------\n");
for(i = 0 ; i < 6 ; i++){
for(j = 0; j < 3 ; j++){
printf("%d ", A[i][j]);
}
printf("\n");
}
}
int main(){
int num[6][3];
int i, j;
for(i = 0 ; i < 6 ; i++){
for(j = 0; j < 3 ; j++){
scanf("%d", &num[i][j]);
}
}
printA(num);
return 0;
}
此时的值与输入的值一一对应。
(2)传递二维数组的列数和参数中二维数组的列数不相等时
#include <stdio.h>
void printA(int A[][4]){
int i, j;
printf("----------\n");
for(i = 0 ; i < 6 ; i++){
for(j = 0; j < 3 ; j++){
printf("%d ", A[i][j]);
}
printf("\n");
}
}
int main(){
int num[6][3];
int i, j;
for(i = 0 ; i < 6 ; i++){
for(j = 0; j < 3 ; j++){
scanf("%d", &num[i][j]);
}
}
printA(num);
return 0;
}
此时有些软件会报错,有些软件会警告(可以运行,但是相应的值不对等,这里具体体现为A与num对应的值不相等)
总结
此时由于二维数组A的列数为4,二维数组num的列数为3,列数不相等,有的软件会提示两者不兼容,而有的软件会警告:[Warning] passing argument 2 of ’ printA ’ from incompatible pointer type [enabled by default],可以运行,但是二维数组num与A的值不会一一对应。
小提示:Courier New字体是word里面最接近写代码的字体,里面的符号容易区分中英文。