C程序输出|设置24

预测以下C程序的输出: 难度等级:新手 问题1

null

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)。 如果您发现以上答案/解释不正确,或者您想分享有关上述主题的更多信息,请发表评论

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享