下列关于指针的用法中错误的是( )。 A. int i,*p; p =&i; B. int *p; p = NULL; C. int i,*p=&i; D. int i = 5,*p; *p = &i;
时间: 2023-09-19 07:06:25 浏览: 200
### 回答1:
&i;
B. int i=10,*p=&i;
C. int i=10,*p; *p = &i;
D. int i=10,*p; p = i;
在这里,错误的是 C 选项。在 C 选项中,*p 尝试去赋值 &i,但是 *p 是一个指针变量,而 &i 是 i 变量的地址。因此,不能将 &i 赋值给 *p。
正确的用法应该是将 p 赋值为 &i,然后使用 *p 来访问 i 变量的值。例如:
int i = 10, *p;
p = &i;
*p = 20; // 现在 i 的值为 20
另外,A 选项是正确的,B 选项也是正确的,D 选项是错误的。在 D 选项中,p 尝试赋值 i,但是 p 是一个指针变量,而 i 是一个整数变量。因此,不能将 i 赋值给 p。
### 回答2:
&i; *p= 10; B. int a[5]; int *p = a; C. int i; int *p = &i; D. int a[5]; int *p = &a;
### 回答3:
&i; B. int *p,i; p = &i; C. int *p,i; *p = &i; D. int i,*p; *p = 10; 正确答案是:C. int *p,i; *p = &i;
解释:C选项中,指针p未被初始化,不能直接将地址&i赋给*p。应该先为指针p分配内存空间,然后再将地址赋给它。正确写法应该是 int *p,i; p = &i; *p = 10;
相关问题
1. 必做题 请编写一个函数 GetBirthDate, GetBirthDate 的功能是将一个身份证号码中的出生日期转为整数,其中 GetBirthDate 函数的调用形式已经在 main 函数内给出。 1. int main(void){ 2. char id[]="51010219990506001X"; 3. int date=0,year,month,day; 4. 5. date= GetBirthDate(id); 6. year=date/10000; 7. month=date/100%100; 8. day=date%100; 9. printf("%04d-%02d-%02d\n",year,month,day); 10. 11. return 0; 12. } 2. 选做题 a) 请分析下列程序中指针的使用有什么问题。 #include int main(void){ int *p; *p = 8; printf("%d", *p); return 0; } b) 请分析下列程序中指针的使用有什么问题。 #include int* fun(){ int n = 8; return &n; } int main(void){ int *p; p = fun(); printf("%d", *p); return 0; } c) 请分析下列程序中指针的使用有什么问题。 #include int main(void){ char *p = "abc"; *p = '@'; printf("%s", p); return 0; }
1. GetBirthDate函数的实现如下:
```c
int GetBirthDate(char *id){
int year = (id[6]-'0')*1000 + (id[7]-'0')*100 + (id[8]-'0')*10 + (id[9]-'0');
int month = (id[10]-'0')*10 + (id[11]-'0');
int day = (id[12]-'0')*10 + (id[13]-'0');
return year*10000 + month*100 + day;
}
```
该函数将身份证号码中的出生日期提取出来,并且以整数的形式返回,具体实现方法是通过字符串下标获取身份证号码中对应的数字字符,然后将其转为整数相加得到年月日,最终返回一个整数表示出生日期。
2. a) 在该程序中,指针p没有被初始化,即没有被赋值为指向某个合法的内存地址,直接使用*p会导致未知的结果,可能会崩溃程序。
正确的做法应该是先为指针p分配一块内存空间,然后将*p赋值为8,如下所示:
```c
int main(void){
int *p = (int *)malloc(sizeof(int));
*p = 8;
printf("%d", *p);
free(p);
return 0;
}
```
b) 在该程序中,fun函数返回的是一个指向局部变量n的指针,当fun函数执行完毕之后,n所在的内存空间就被释放了,p指向的内存空间已经不再是有效的,使用*p会导致未知的结果,可能会崩溃程序。
正确的做法应该是在fun函数中动态分配一个内存空间,并将n的值赋值给该内存空间,然后返回该内存空间的指针,如下所示:
```c
int* fun(){
int *p = (int *)malloc(sizeof(int));
*p = 8;
return p;
}
int main(void){
int *p = fun();
printf("%d", *p);
free(p);
return 0;
}
```
c) 在该程序中,指针p指向了一个常量字符串"abc",该字符串存储在程序的只读数据段中,不允许修改,但是通过*p = '@'尝试修改该字符串的值,会导致程序崩溃或者未知的结果。
正确的做法应该是将"abc"复制到一个可读写的内存空间中,然后将指针p指向该内存空间,如下所示:
```c
int main(void){
char str[] = "abc";
char *p = str;
*p = '@';
printf("%s", p);
return 0;
}
```
改写下列语句,使其用法不变int (*a)[3]
可以使用 `typedef` 来简化语句的书写,并使其用法不变,改写后的语句如下所示:
```
typedef int (*IntArrayPtr)[3];
IntArrayPtr a;
```
这里使用 `typedef` 定义了一个名为 `IntArrayPtr` 的类型,它是一个指向长度为 3 的整型数组的指针类型。然后,使用 `IntArrayPtr` 来声明变量 `a`,使其类型为指向长度为 3 的整型数组的指针,其用法与原语句中的 `int (*a)[3]` 相同。