c语言中有关指针的题型整理,以及一些详解

(1)应注意其二维数组的书写形式,以及逗号表达式的

#include<stdio.h>
int main()
{
	int a[3][2]= {(0,1),(2,3),(4,5)};
	//因为这是()代表逗号表达式,而不是二维数组
	//所以表示{1,3,5}
	int *p;
	p = a[0];
	printf("%d",p[0]); 
	return 0;
}

(2)要注意数组名表示首元素地址,解引用之后表示首元素&a表示整个数组,+1表示指向数组后面的地址,ptr-1又指向数组末尾,解引用表示最后一个元素

#include<stdio.h>
int main()
{
	int a[5] = {1,2,3,4,5};
	int * ptr = (int*)(&a+1);
	printf("%d %d",*(a+1),*(ptr-1)); 
	//a表示数组首元素的地址,ptr-1表示数组末尾元素的地址,解引用是5 
	return 0;
}

(3)注意:指针+1和类型有关,整数+1就是+1.

#include<stdio.h>
struct Num
{
	itn Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p = (struct Test*)0x100000;
int main()
{
	printf("%p\n",p+ 0x1);//p是结构体指针,+1就是跳过一个结构体,一个结构体是20个字节
	//0x00100014   ,20转化为16进制是14。 
	printf("%p\n",(unsigned long)p + 0x1);//整数+1---0x00100001 
	printf("%p\n",(unsigned int*)p + 0x1);//+1跳过一个unsigned int类型的变量是4个字节 --0x00100004 
	
	return 0;
 } 

(4)硬是要把int(*)[5]赋给int(*)[4]类型,最好画出其图案方便理解在内存中的存储问题。

(5)画出他的内存空间,便于理解指针的指向问题,

&arr+1表示指针指向数组后的地址,然后又ptr-1解引用后表示数组的最后一个元素。

aa表示数组首元素地址+1表示第二行首元素的地址6

#include<stdio.h>
int main()
{
	int aa[2][5] = {1,2,3,4,5,6,7,8,9,10};
	int *ptr1 = (int*)(&aa + 1);//&数组名表示整个数组,+1表示指向数组后面的地址 
	int *ptr2 = (int*)(*(aa+1));//数组名表示首元素地址,二维数组+1,数组名表示下一行的元素 
	printf("%d , %d",*(ptr1-1),*(ptr2-1));//ptr1-1表示 数组的末尾元素,ptr2指向6. 
	return 0;
 } 

(6)画出图形,标好指向更容易看出

#include<stdio.h>
int main()
{
	char* a[]={"work","at","alibaba"};//数组有三个元素分别是三个字符串"work""at""ablibaba" 
	char** pa = a;                    //二级指针p,a表示数组首元素地址 
	pa++;                             //指向下一个存储空间 
	printf("%s\n",*pa);               //最后输出的值是at 
	return 0;
 } 

(7)按照右图对其分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值