小甲鱼学c 2

暂时欠的:6

24

#include<stdio.h>
int main()
{
/* const float pi=3.14;
printf("%f\n",pi);*/

/* int num=520;
const int cnum=880;
const int *pc=&cnum;

printf("cnum:%d,&cunm:%p\n",cnum,&cnum);
printf("pc:%d,pc:%p\n",*pc,pc); //为啥不&pc(第二个pc) 

pc =&num;
printf("num:%d,&num:%p\n",num,&num);
printf("pc:%d,pc:%p\n",*pc,pc);
//pi=3.1415;

num=1024;
printf("*pc:%d,pc:%p\n",*pc,pc);*/

/* int num=520;
const int cnum=880;
int * const p=#

*p=1024;
printf("*p:%d\n",*p);

p = &cnum;  //出错了?? 
printf("*p:%d\n",*p);

/
/
int num=520;
const int cnum=880;
const int * const p=#

num=1024;
printf("*p:%d\n",*p);

*/

int num=520;
const int cnum=880;
const int * const p=&num;
const int * const *pp=&p;

printf("pp:%p,&p:%p\n",pp,&p);//没想到和老师答案不一样,原来是写成大写P了 
printf("*pp:%p,p:%p,&num:%p\n",*pp,p,&num);	
printf("**pp:%d,*p:%d,num:%d\n",**pp,*p,num);

return 0;

}

23#include<stdio.h>
int main()
{
/* int num=520;
int *p=#
int **pp=&p;

printf("num:%d\n",num); 
printf("num:%d\n",*p); 
printf("num:%d\n",**pp); 
printf("&p:%p, pp:%p\n",&p,pp);  //为啥带&pp 地址就不一样了 
printf("&num:%p,p:%p, *pp:%p\n",&num,p,*pp); //这里pp为啥是带*,不带& 

/
/
char *cBooks[]={
“<<c程序设计语言>>”,
“<<c专家编程>>”,
“<<c和指针>>”,
“<<c陷阱和缺陷>>”,
“<>”,
“<<带你学C带你飞>>” };
char **byFishC;
char **jiayuLoves[4];
int i;

byFishC=&cBooks[5];
jiayuLoves[0]=&cBooks[0];
jiayuLoves[1]=&cBooks[1];
jiayuLoves[2]=&cBooks[2];
jiayuLoves[3]=&cBooks[3];

printf("FishC出版的图书馆: %s",*byFishC);
printf("小甲鱼喜欢的图书有:\n");   

for(i=0;i<4;i++)
{
	printf("%s\n",*jiayuLoves[i]);
}*/

/* int array[10]={0,1,2,3,4,5,6,7,8,9};
int *p=array;
int i;

for(i=0;i<10;i++)
{
//	printf("%p\n",p[i]);
	 //这样是什么意思呢 
	printf("%d\n",*(p+i));
} */

/* int array[3][4]={
{0,1,2,3},
{4,5,6,7},
{8,9,10,11}
};

// int **p=array;
int i,j;

for(i=0;i<3;i++)
{
	for(j=0;j<4;j++)
	{
		printf("%2d ",*(*(array+i)+j));
	}
	printf("\n");
	
} */

/* int array[3][4]={
{0,1,2,3},
{4,5,6,7},
{8,9,10,11}
};

int **p=array;
int i,j;

printf("p:%p,array:%p\n",p,array);
printf("p+1:%p,array+1:%p\n",p+1,array+1);
//出错了 ??? 
*/

int array[3][4]={
	 {0,1,2,3},
	 {4,5,6,7},
	 {8,9,10,11}
};

// int (*p)[4]=array;
int (*p)[3][4]=&array;
int i,j;

for(i=0;i<3;i++)
{
	for(j=0;j<4;j++)
	{
		printf("%2d ",*(*(*p+i)+j));
	}
	printf("\n");
	
} 
return 0;

}

22指向指针的指针
双重解引用**p,单重解引用p,指针也是p,也可以说求值*p,&p求地址。

21void指针和NULL指针
NULL不是NUL

NULL用于指针和对象,表示指向一个不被使用的地址,而’\0’表示字符串的结尾。
#include<stdio.h>
int main()
{
/* void a; // 这里出错了
printf("%d\n",sizeof(void)); */

/* int num=1024;
int *pi=#
char *ps=“FishC”;
void *pv;

pv=pi;
printf("pi:%p,pv:%p\n",pi,pv);
printf("pv:%d\n",*(int*)pv);


pv=ps;
printf("ps:%p,pv:%p\n",ps,pv);
printf("pv:%s\n",pv);*/

int *p1;
int *p2=NULL;

printf("%d\n",*p1);
printf("%d\n",*p2);



 
return 0;

}

20指针和二维数组

#include<stdio.h>
int main()
{
/* int array[4][5]={0};
printf(“sizeof int :%d\n”,sizeof(long long int));//ar 占一字节,int 4个,long 也是4个,long long 8个
printf(“array:%p\n”,array);
printf(“array+1:%p\n”,array+1);
*/一维数组+1是下一个元素,二维数组+1是下一行

/* int array[4][5]={0};
int i,j,k=0;

for(i=0;i<4;i++)
{
	for(j=0;j<5;j++)
	{
		array[i][j]=k++;
	}
}
//语法糖(就是给程序员的糖,简化格式): *(array+1)==array[1]== &array[1][0]
printf("*(array+1):%p\n",*(array+1));
printf("*(array+1):%p\n",array[1]);
printf("*(array+1):%p\n",&array[1][0]);
printf("**(array+1):%d\n",**(array+1));
//双重**解引用(解引用就是取出地址里面的值)
printf("*(*(array+1)+3):%d\n",*(*(array+1)+3));
printf("array[1][3]:%d\n",array[1][3]); */

int array[2][3]={{0,1,2},{3,4,5}};
int (*p)[3]=array;
//语法糖: *(*(p+1)+2)== *(*(array+1)+2)== array[1][2]
printf("**(p+1):%d\n",**(p+1)); //3
printf("**(array+1):%d\n",**(array+1)); //3
printf("**(p+1):%d\n",array[1][0]); //3
printf("*(*(p+1)+2):%d\n",*(*(p+1)+2)); //5
printf("*(*(array+1)+2):%d\n",*(*(array+1)+2));  //5 
printf("array[1][2]:%d\n",array[1][2]); //5

return 0;

}

19数组指针和指针数组

#include<stdio.h>
int main()
{
/* char str[]=“l love FishC.com!”;
char *target=str;
int count=0;

// while (*str++ !=’\0’)//出错 ,str是该数组的领头羊,
//如果str被改变,整个数组的地址都会被改变,变成野指针,是不对的
while (target++ !=’\0’)//先运行++再到,因为++优先级高
{
count++;
}
printf(“总共有%d个字符!\n”,count);

int a=1;
int b=2;
int c=3;
int d=4;
int e=5;
int *p[5]={&a,&b,&c,&d,&e};
int i;

for(i=0;i<5;i++)
{
	printf("%d\n",*p[i]);//没想到 *写成&直接打出地址了 
} */

/* char *p[5]={
“让编程改变世界-鱼C工作室”,
“just do it–NIKE”,
“一切皆有可能”,
“永不止步–李宁”,
“One more thing–乔布斯”}; //没想到这里中文逗号竟然不行
int i;

	for(i=0;i<5;i++)
	{
		printf("%s\n",p[i]);//原来%d会出错 ,%c是字符,%s是字符串 
	}*/ 
	
//	int (*p2)[5]={1,2,3,4,5}; //直接报错,大括号初始化 char a[] 没问题,如果用大括号初始化 char * 就会报【Error】
//	int p2[5]={1,2,3,4,5};

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

// int (*p2)[5]=temp; //出错
int (*p2)[5]=&temp;//大概是给一个身份,一个数组的地址身份,虽然数组名,指针,数组第一个元素的地址都是相等的
int i;

	for(i=0;i<5;i++)
	{
		printf("%d\n",*(*p2+i));
	} //这里竟然通过了 

/* int (*p2)[5]=={1,2,3,4,5}; //报错了
int i;

for(i=0;i<5;i++)
	{
		printf("%d\n",temp[i]);
	}	*/
return 0;

}

疑问:
22,23,24

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值