黑马程序员——C语言基础---指针2
2015-09-29 17:31
204 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------
四、二级指针介绍
1、二级指针介绍
如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。也称为“二级指针”
通过指针访问变量称为间接访问。由于指针变量直接指向变量,所以称为“一级指针”。而 如果通过指向指针的指针变量来访问变量则构成“二级指针”。
2、多级指针介绍
注意:
int ***m1; 取值***m1
int *****m2 取值*****m2
五、数组指针
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++正 确)
第七讲 一维指针数组概念
1、一维指针数组
一个数组的元素值为指针则是指针数组。 指针数组是一组有序的指针的集合。 指针数组的所有元素都必须是具有相同存储类型和 指向相同数据类型的指针变量。指针数组说明的一般形式为:
类型说明符 *数组名[数组长度]
其中类型说明符为指针值所指向的变量的类型。
-------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培训、期待与您交流! -------
相关文章推荐
- 关于指针的一些事情
- Lua和C语言的交互详解
- C# Pointer指针应用实例简述
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言
- C语言实现BMP转换JPG的方法
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- C语言查找数组里数字重复次数的方法
- C++智能指针实例详解
- C语言泛型编程实例教程