一、学习的知识点
指针
- 定义指针变量记得初始化,或者初始化为NULL:void *p=NULL;
- 指针变量存放的是地址,可以比较大小,但必须是同类型。
- 数组作为函数形参的三种写法:p【】,p【20】,*p
- NULL//值为0,无类型的指针,stdio.h
- char *temp=“hello”,"hello"是常量,存储在常量区。temp指针变量指向的是一个字符串常量,此时不能通过指针变量修改常量的内容
char name[20]="admin";
char pwd[20];
pwd=name; //错误
char *pstr=name; //指针指向字符串变量,可以通过下标或者地址偏移方式改变值
char *temp="hello"; //temp指针指向 字符串常量
指针高级
数组指针
{ int num[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int i=0,j=0;
int (*p)[4]=num; //指向二维数组的指针---行指针(数组指针),每行4个元素,不可省
int *p[4]; //指针数组 指针类型的数组,数组里面保存的是int类型的指针,占用4*4-16个字节空间
/*行指针-本质是指针,使用在二维数组作为函数参数的时候,行指针+1,偏移1行
指针数组-本质是数组,通常可以应用在二维字符数组上,保存多个字符串*/
char *stu[20]={"lili","rose","lucy"}; //指针数组,保存三个字符串在常量区对应的地址
puts(stu[1]); //访问到rose
p++; //偏移行
//访问二维数组的元素
printf("%d\n",num[1][1]); //下标法
for(i=0;i<3;i++)
{
for(j=0;j<4,j++)
{
printf("%d\t",num[i][j]); //下标法
printf("%d\t",*(num[i]+j)); //每一行的首地址偏移,取内容
printf("%d\t",*(*(num+i)+j)); //
printf("%d\t",*(num+i)[j]); //*(num+i)[j]->*(p)[j]
printf("%d\t",*(&num[0][0]+4*i+j)); //num &num[0][0]+4*i+j
}
printf("\n");
}
printArry(num,3); //函数调用
}
//int p[3][4] int p[][4] int (*p)[4] 二维数组形参方式
void printArry(int num[][4],int row)
{
int i=0,j=0;
for(i=0;i<row;i++)
{
for(j=0;j<4,j++)
{
//printf("%d\t",num[i][j]); //下标法
//printf("%d\t",*(num[i]+j)); //每一行的首地址偏移,取内容
//printf("%d\t",*(*(num+i)+j)); //
printf("%d\t",*(num+i)[j]); //*(num+i)[j]->*(p)[j]
//printf("%d\t",*(&num[0][0]+4*i+j)); //num &num[0][0]+4*i+j
}
printf("\n");
}
}
结构体指针
保存的是结构体变量对应的地址
typedef struct staff
{
}STAFF_T;
STAFF_T user={1001,"admin","123456"};
STAFF_T *puser=NULL;
puser=&user;
//结构体指针变量访问数据成员的格式:指针变量名+->变量名
printf("%s\n",puser->name);
二、上课没有听懂或者没有理解的地方
无
三、当天学习的收获
学习了访问二维数组元素的几种方法
四、作业的思路、不会的地方
使用结构体指针作为形参
五、其他需要反馈的问题
无
六、心得体会
数组指针和指针数组比较难理解消化,多学多练。