您的位置:首页 > 编程语言 > C语言/C++

黑马程序员——C语言基础---指针2

2015-09-29 17:31 204 查看
                                                                   ------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]={&
9fe3
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培训、期待与您交流! -------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C语言 指针