数组指针 原理以及三个经典C程序的解惑 C知识回顾第二天

开始一段时间比较懒散 没有去整理自己所学的知识,从今天开始每周最少更新一篇关于自己的博客 C语言知识回顾第二天
指针是指针 数组是数组 指针数组要区分
a) 一个整型数(An integer)
b) 一个指向整型数的指针(A pointer to an integer)
c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer)
d) 一个有10个整型数的数组(An array of 10 integers)
e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers)
f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an integer )

答案是:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

原题分析:
*下面程序的输出结果是多少*
1:**

main() 
{ 

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

int *ptr = (int*)(&a+1); 

printf("%d %d" , *(a+1), *(ptr-1) ); 

} 

答:2 5
解析:&a+1 不是表示a的地址(设为Ox0010)加1,变为0x0011. 由于a为包括5个int类型的数组,则”&a+1”中的”+1”表示为相当于”1”个a大小的空间(或成为偏移),此时&a+1 表示 a[5].

2:

void foo(int [][3] ); 
main() 
{ 
int a [3][3]= { { 1,2,3} , { 4,5,6},{7,8,9}}; 
foo(a); 
printf("%d" , a[2][1]); 
} 
void foo( int b[][3]) 
{ 
++ b; 
b[1][1] =9; 
} 

答:9
解析:函数中数组传递的是地址,而不是值
当调用到foo(a)时候,把a的地址传给了b,然后执行foo函数,其中++b,其实就是把a的地址换到第二行,也就是 把b当前的地址推移到了a[1][0]。然后开始b[1][1]=9,这一步其实就是, a[1+1][0+1] 也就是 a[2][1]=9;

3:

main()
{
int a[][3] = { 1,2,3 ,4,5,6};
int (*ptr)[3] =a;
printf(“%d %d ” ,(*ptr)[1], (*ptr)[2] );
++ptr;
printf(“%d %d” ,(*ptr)[1], (*ptr)[2] );
}
答:2 3 5 6
解析:这就可以看出我们二维数组和数组指针赋值这块没什么区别了,
把a的地址给了ptr,ptr是一个指针指着三个常量,++ptr,就是另外的三个常量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值