#include<stdio.h>intmain(){int a[3]={1,2,3};int* p = a;//a-->&a[0] 等效//no.1//正常操作: 直接存储数组的首地址//[]操作等效取*运算//直接把指针当作数组名就可以了//优点,这种方式稳妥,不容易出错,一般使用这种方式就够了for(int i =0; i <3; i++){printf("%d ", p[i]);}printf("\n");//no.2//用指针做偏移操作for(int i =0; i <3; i++){printf("%d ",*(p+i));}printf("\n");//a=a+3; 不能修改//a+3-->&a[3]; 等效for(p = a; p < a +3; p++){printf("%d\t",*p);//*p等效p[0] 取当前地址对应内存中值}return0;}
//no.3//非正常操作:指向其他元素开始操作数组#include<stdio.h>intmain(){int a[3]={1,2,3};int* p =&a[2];//指针指向第三个数printf("%d\n",*p);//打印指针所指向的数printf("%d\n", p[0]);//打印指针所指向的数printf("%d\n", p[-1]);//打印指针所指向的数的前一个数printf("%d\n", p[1]);//打印指针所指向的数的后一个数,此处由于超出数组长度,没有这个数,所以打印的是-858993460return0;}
一级指针操作字符串
#include<stdio.h>intmain(){char str[]={"iloveyou"};char* p = str;puts(p);char* pstr = str +5;puts(pstr);putchar(p[0]);//p[0] 等效*p操作,等效取当前地址下面值putchar('\n');putchar(pstr[0]);//打印第六个字符return0;}
指针操作二维数组
二维数组基础知识
数组名:指向数组的指针
行地址:数组名[i];
#include<stdio.h>intmain(){int array[2][3]={1,2,3,4,5,6};int* p =&array[0][0];printf("%p\n", array);//打印数组第0行的首地址printf("%p\n", array[0]);//打印数组第0行的首地址printf("%p\n",&array[0][0]);//打印数组的首地址printf("%p\n", array +1);//打印数组第1行的首地址(即4的地址)printf("%p\n", array[1]);//打印数组第1行的首地址(即4的地址)printf("%p\n", p +1);//打印数组第二个元素地址(即2的地址)printf("%p\n", array[0]+1);//打印数组第0行第1个元素的地址(即2的地址)return0;}
两种方法
一级指针操作二维数组 (二维数组在内存连续的)
#include<stdio.h>intmain(){int array[2][3]={1,2,3,4,5,6};int* p =&array[0][0];for(int i =0; i <2; i++){for(int j =0; j <3; j++){printf("%d ",*(p + j + i *3));//j+i*3 把坐标转为第几个元素}printf("\n");}return0;}
数组指针操作二维数组
#include<stdio.h>intmain(){int array[2][3]={1,2,3,4,5,6};int(*p)[3]=NULL;//必须要有括号,和表示的数组列数相同的列数//先看括号里面是一个指针//数组指针 即指向数组的指针//联想整形指针,指向整数
p = array;//这样就可以直接当作数组名去用就行了for(int i =0; i <2; i++){for(int j =0; j <3; j++){printf("%d ", p[i][j]);}printf("\n");}return0;}