暂时欠的: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 =#
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=#
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