06_指针
一、导入:
指针是C语言里最强大的特性之一,当然它也是最容易让我们困惑的,所以尽量在开始时就正确的理解其概念.
二、指针的定义
可以存储地址的变量称为指针(pointers);
类型 *指针变量名 |
int * pj; |
char *s; |
float *var; |
三、指针的初始化
int i;
int *pi=&i; //&是取变量地址的符号 之前的scanf里用到过
四、通过指针访问值
int i=123321;
int *pi=&i; //实际上int*是类型 pi是指针变量名
printf("%d,%d\n",i,*pi);
int *pi
|
int* pi |
int * pi
|
以上三种写法等价 |
实例:
#include <stdio.h> #include <string.h> int main(void) { int i[2]={100,200}; int *p=&i; printf("%x, %d\n",p, *p); p=(int*)((int)p+sizeof(int)); printf("%d,%d",i[0],*p); getchar(); return 0; }
95f8fc, 100 100,200
五、指针的命名
以后我们编写的代码越来越大,很难分清那个是变量,那个是指针,因此我们最好将p作为指针名的第一个字母。这样我们便于区别那个是变量,那个是字母。
六、指针的运算
1、++运算
2、--运算
3、+运算
4、-运算
#include <stdio.h> #include <string.h> int main(void) { int *pj; pj=(int*)10; printf("pj=%d, *pj=%d\n",pj, sizeof(pj) ); pj=pj-2;//10-4*2 printf("%d\n",pj ); // sizeof(double) getchar(); return 0; }
pj=10, *pj=4 2
七、用指针访问数组
#include <stdio.h> #include <string.h> int main(void) { int i; int ai[11]={0,11,12,13,14,5,6,7,8,9,10};//12ff3c int* pi=&ai[10] ; for (i=0;i<11;i++) { printf("%#x,%d \n",pi,*pi--); } getchar(); return 0; }
0xdefd48,10 0xdefd44,9 0xdefd40,8 0xdefd3c,7 0xdefd38,6 0xdefd34,5 0xdefd30,14 0xdefd2c,13 0xdefd28,12 0xdefd24,11 0xdefd20,0
八、指向常量的指针
定义形式: const 类型 * 指针名;
不能通过指针修改地址里的值。
int i=0x123;
const int *p=&i;
*p=0; //错误
//前置const 指针
九、 常量指针
定义形式: 类型* const 指针名;
后置const不能改变地址
int i=0x123;
int j=0x456;
int * const p=&i;
*p=0; //正确
p=&j; //错误
//后置const指针
小结:
前置const不能通过指针改变地址内的值 (在*号前) *p=???;
后置const不能改变地址,也就是不能从新给指针赋值(在*号后) p=???;
#include <stdio.h> #include <string.h> int main(void) { // const int *p=(int*)1; ////*p=0; //错误 // p=(int*)0x333; // int i=100; // int j=200; // int const *p=&i; //*p=0; //错误 // i=0; // p=&j; int i=0x123; int j=0x456; int * const p=&i; *p=0; //正确 // p=&j; //错误 getchar(); return 0; }
十、 用指针访问一维数组
#include <stdio.h> #include <string.h> int main(void) { //代码 int i=0; int a[2]={11,22}; int *p=&a; //int *p=&a[0]; printf("%d\n",*p); p++; printf("%d",*p); /*代码 int i=0; int a[2]={11,22}; int *p=&a; //int *p=&a[0]; for(i=0;i<2;i++,p++) { printf("%d\n",*p); } 代码 int i=0; int a[2]={11,22}; int *p=&a; //int *p=&a[0]; for(i=0;i<2;i++) { printf("%d\n",p[i]); } */ getchar(); return 0; }
二、 用指针访问二维数组
三、 用指针访问三维数组
#include <stdio.h> #include <string.h> int main(void) { int a[2][3][4]={ {{ 1, 2 ,3 ,4} , {5, 6, 7, 8} ,{ 9,10,11,12}}, {{13,14,15,16} , {17,18,19,20} ,{21,22,23,24}} }; //int (*p)[3][4]=(void*)0x12ff04;//0x12ff04 int (*p)[3][4]=a; int i,j,k; printf("%#x\n",&a); for (i=0;i<2;i++) { for (j=0;j<3;j++) { printf("{"); for (k=0;k<4;k++) { printf("%d,",p[i][j][k]); } printf("},"); } printf("\n"); } getchar(); return 0; }
0xcffb90 {1,2,3,4,},{5,6,7,8,},{9,10,11,12,}, {13,14,15,16,},{17,18,19,20,},{21,22,23,24,},
小结:
访问 int a[x][y][z][i][j]的指针 定义为 int (*p)[y][z][i][j]