------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------
四、二级指针介绍
1、二级指针介绍
如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。也称为“二级指针”
通过指针访问变量称为间接访问。由于指针变量直接指向变量,所以称为“一级指针”。而 如果通过指向指针的指针变量来访问变量则构成“二级指针”。
2、多级指针介绍
注意:
int ***m1; 取值***m1
int *****m2 取值*****m2
<span style="font-size:14px;">#include <stdio.h>
int main(int argc, const char * argv[]) {
int a = 5;
//定义一个指针变量
int *p = &a;
printf(" &a = %p\n",&a);
printf(" p = %p\n",p);
printf("---------------\n");
//定义一个二级指针
// ** 的个数 等于 级数
int **p1 = &p;
printf(" &p =%p\n",&p);
printf(" p1 =%p\n",p1);
printf("---------------\n");
printf("*p =%d\n",*p);
//p的值,a的地址
printf("*p1 =%p\n",*p1);
printf("**p1 =%d\n",**p1);
int ***p2 = &p1;
printf("%d\n",***p2);
int ****p3 = &p2;
printf("%d\n",****p3);
return 0;
}</span>
五、数组指针
1、数组指针
数组元素指针
一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地址
指针变量可以指向数组元素(把某一元素的地址放到一个指针变量中)
所谓数组元素的指针就是数组元素的地址
可以用一个指针变量指向一个数组元素
注意:
数组名a不代表整个数组,只代表数组首元素的地址。 “p=a;”的作用是“把a数组的首元素的地址赋给指针变量p”,而不是“把数组a各元素的值赋给 p”
六、使用指针引用数组元素
1、使用指针引用数组元素
在指针指向数组元素时,允许以下运算:
加一个整数(用+或+=),如p+1
减一个整数(用-或-=),如p-1
自加运算,如p++,++p
自减运算,如p--,--p
两个指针相减,如p1-p2 (只有p1和p2都指向同一数组中的元素时才有意义)
如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,p-1指向同 一数组中的上一个元素。
float a[10],float *p=a;
假设a[0]的地址为2000,则
p的值为2000
p+1的值为2004
p-1的值为1996
注意:
1)如果p的初值为&a[0],则p+i和a+i就是数组元素a[i]的地址,或者说,它们指向a数组 序号为i的元素
2)*(p+i)或p+i或a*(a+i)是+i所指向的数组元素,即a[i]。
3)如果指针p1和p2都指向同一数组
结论: 引用一个数组元素,可用下面两种方法:
(1)下标法,如a[i]形式
(2)指针法,如*(a+i)或*(p+i)收地
(3)a是常量(a++错误),p是变量(p++正 确)
<span style="font-size:14px;">#include <stdio.h>
int main(int argc, const char * argv[]) {
int a[4]={1,2,3,4};
printf("&a[0] = %p\n",&a[0]);
printf("&a[1] = %p\n",&a[1]);
printf("&a[2] = %p\n",&a[2]);
//数组指针
int *p = a; //p指向数组的第一个元素
printf(" p = %p\n",p); //0x7fff5fbff7d0
//p+1*sizeof(int)
printf(" p+1 = %p\n",p+1);//== &a[1],误区:0x7fff5fbff7d1
printf(" a+1 = %p\n",a+1);
//取得p+1对应的存储单元的内容
printf(" *(p+1) = %d\n",*(p+1));
printf(" *(a+1) = %d\n",*(a+1));
//使用数组指针和使用数组名的区别
//p = p+1
//*p++ // 1
//p是一个指针变量,既然是一个变量,它存放的值是可以改变的
// printf(" *p++ = %d\n",*p++); //1
// printf(" *p = %d\n",*p);
//用数组指针遍历数组
for (int i=0; i<4; i++) {
//printf("%d\t",*p++); //
printf("%d\t",*(a+i)); // p一值指向数组的首地址
}
//学习的误区: 数组名 a是一个常量 *(10++)
//数组名++ 这是错误的
//printf(" *a++ = %d\n",*a++); //错误的
printf(" *a = %d\n",*a); //1
return 0;
}</span>
第七讲 一维指针数组概念
1、一维指针数组
一个数组的元素值为指针则是指针数组。 指针数组是一组有序的指针的集合。 指针数组的所有元素都必须是具有相同存储类型和 指向相同数据类型的指针变量。指针数组说明的一般形式为:
类型说明符 *数组名[数组长度]
其中类型说明符为指针值所指向的变量的类型。
<span style="font-size:14px;">#include <stdio.h>
int main(int argc, const char * argv[]) {
int a=3,b=4,c=5;
int *pa[3]={&a,&b,&c};
//打印的是指针数组的第一个元素得值
printf(" &a = %p\n",&a);
printf(" pa[0] = %p\n",pa[0]);
//打印指针数组的首地址
printf(" pa = %p\n",pa);
printf(" &pa[0]= %p\n",&pa[0]);
//访问a的值 a = 3
printf(" *(&a) = %d\n",*(&a));
printf(" *(pa[0]) = %d\n",*(pa[0]));
//使用数组名来访问 a的值
//*pa == pa[0] (a的地址)
//**pa
printf("%d\n",**pa);
int a1[2][2]={1,2,3,4};
//定义了一个指针数组 ,赋值为a1[0] 是第一行的地址
int *pa1[2]={a1[0],a1[1]};
printf("**pa1 = %d\n",**pa1);
//pa1+1 &pa1[1]
//*(pa1+1) pa1[1]
printf("**(pa1+1) = %d\n",**(pa1+1));
return 0;
}</span>
-------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------