预测以下C程序的输出: 难度等级:新手 问题1
C
#include<stdio.h> int main() { int arr[] = {10, 20, 30, 40, 50, 60}; int *ptr1 = arr; int *ptr2 = arr + 5; printf ( "ptr2 - ptr1 = %d" , ptr2 - ptr1); printf ( "(char*)ptr2 - (char*) ptr1 = %d" , ( char *)ptr2 - ( char *)ptr1); getchar (); return 0; } |
输出:
ptr2 - ptr1 = 5 (char*)ptr2 - (char*) ptr1 = 20
在C语言中,数组名给出数组中第一个元素的地址。所以当我们做ptr1=arr时,ptr1开始指向arr的第一个元素的地址。由于数组元素是使用指针算法访问的,所以arr+5是一个有效的表达式,并给出了第六个元素的地址。预测值ptr2–ptr1很容易,它给出5,因为这两个地址之间有5个整数。当我们执行(char*)ptr2时,ptr2被类型化为char指针。在表达式“(int*)ptr2–(int*)ptr1”中,指针运算考虑字符指针。因为一个字符的大小是一个字节,所以我们得到5*sizeof(int)(即20)作为两个指针的差。 作为练习,预测以下程序的输出。
C
#include<stdio.h> int main() { char arr[] = "geeksforgeeks" ; char *ptr1 = arr; char *ptr2 = ptr1 + 3; printf ( "ptr2 - ptr1 = %d" , ptr2 - ptr1); printf ( "(int*)ptr2 - (int*) ptr1 = %d" , ( int *)ptr2 - ( int *)ptr1); getchar (); return 0; } |
问题2
C
#include<stdio.h> int main() { char arr[] = "geeks for geeks" ; char *str = "geeks for geeks" ; printf ( "arr = %s, sizeof(arr) = %d " , arr, sizeof (arr)); printf ( "str = %s, sizeof(str) = %d" , str, sizeof (str)); getchar (); return 0; } |
输出:
arr = geeks, sizeof(arr) = 17 str = geeks, sizeof(str) = 4
让我们先谈谈第一输出 “arr=极客” 。当使用%s打印字符串时,printf从给定地址的第一个字符开始,并一直打印字符,直到看到字符串终止字符,因此我们得到 “arr=极客” 因为在arr[]中有很多后起之秀。 现在让我们谈谈产出 “sizeof(arr)=17” .当字符数组用双引号字符串初始化,且未指定数组大小时,编译器会自动为字符串终止符”分配一个额外的空间(请参见 这件事 )这就是为什么arr的大小是17。 打印“str=geeks”的解释与打印“arr=geeks”的解释相同。说到sizeof(str)的值,str只是一个指针(不是数组),所以我们将指针的大小作为输出(如果使用64位机器,它也可以等于8)。 如果您发现以上答案/解释不正确,或者您想分享有关上述主题的更多信息,请发表评论