这些只是基础题?你会指针吗,做做这几组题就知道了

笔试题 1
int main ()
{
    int a [ 5 ] = { 1 , 2 , 3 , 4 , 5 };
    int * ptr = ( int * )( & a + 1 );
    printf ( "%d,%d" , * ( a + 1 ), * ( ptr - 1 ));
    return 0 ;
}
// 程序的结果是什么?

 a是数组名代表首元素地址,a+1即a[1]是第二个元素

&a+1表示跳过整个数组指向数组后面的地址,如图

所以*(prt-1)即arr[4]。

笔试题2
int main ()
{
    int a [ 4 ] = { 1 , 2 , 3 , 4 };
    int * ptr1 = ( int * )( & a + 1 );
    int * ptr2 = ( int * )(( int ) a + 1 );
    printf ( "%x,%x" , ptr1 [ - 1 ], * ptr2 );
    return 0 ;
}

 prt1[-1]即*(prt-1),和上题一样

a是首元素地址,强制类型转换位整形,整形加1,跳过一个字节,在强制类型转换为指针,指针四个字节,即被红色方块圈主的是ptr2,如图,以%x(16进制)方式打印应该是02 00 00 00,第一个0省略。

注:虽然数据在内存中是以2进制方式存储的,但在展示时以16进制方式展示

笔试题3
#include <stdio.h>
int main ()
{
    int a [ 3 ][ 2 ] = { ( 0 , 1 ), ( 2 , 3 ), ( 4 , 5 ) };
    int * p ;
    p = a [ 0 ];
    printf ( "%d" , p [ 0 ]);
return 0 ;
}

 这里要注意 上式和int a[3][2] = { {0, 1}, {2, 3}, {4, 5} };的区别

 int a[3][2] = { (0, 1), (2, 3), (4, 5) };中的(0, 1)和(2, 3)和(4, 5)其实时三个逗号表达式,

 int a[3][2] = { 1, 3,  5 };

所以p[0]即a[0][0]。

笔试题4
int main ()
{
    int a [ 5 ][ 5 ];
    int ( * p )[ 4 ];
    p = a ;
    printf ( "%p,%d\n" , & p [ 4 ][ 2 ] - & a [ 4 ][ 2 ], & p [ 4 ][ 2 ] - & a [ 4 ][ 2 ]);
    return 0 ;
}

 int(*p)[4]表示数组指针,p可以指向有四个int型元素的数组。

地址相减算出的是中间的元素个数

地址在内存中由低到高

&p[4][2] - &a[4][2]以%d打印应该是-4,以%p打印,则是-4的补码转换的16进制数

 

笔试题5
int main ()
{
    int aa [ 2 ][ 5 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };
    int * ptr1 = ( int * )( & aa + 1 );
    int * ptr2 = ( int * )( * ( aa + 1 ));
    printf ( "%d,%d" , * ( ptr1 - 1 ), * ( ptr2 - 1 ));
    return 0 ;
}

 

 

笔试题6
#include <stdio.h>
int main ()
{
char * a [] = { "work" , "at" , "alibaba" };
char** pa = a ;
pa ++ ;
printf ( "%s\n" , * pa );
return 0 ;
}

 

 

笔试题7
int main ()
{
char * c [] = { "ENTER" , "NEW" , "POINT" , "FIRST" };
char** cp [] = { c + 3 , c + 2 , c + 1 , c };
char*** cpp = cp ;
printf ( "%s\n" , **++ cpp );
printf ( "%s\n" , *--*++ cpp + 3 );
printf ( "%s\n" , * cpp [ - 2 ] + 3 );
printf ( "%s\n" , cpp [ - 1 ][ - 1 ] + 1 );
return 0 ;
}

 注意优先级*--*++cpp+3是(*(--(*(++cpp))))+3

注意cpp[-2]并不会改变cpp的指向,所以cpp[-2]指向的是cp首元素的地址,但cpp仍然指向cp[-2];

黑色是开始-->红色-->粉色-->蓝色-->紫色

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值