1.指针可以指向字符串 本质是存了字符串首字符的地址
ps和arr放的都是h的地址
printf("%s/n,ps);
printf("%s/n,arr);
第一个为else成立 str1 str2放的都是字符串hello bit. 指向的都是h的地址
第二个为if成立 str3,str4放的一样 但是他俩的字符串是常量字符串是不能改的
str1 str2指向两个字符串 只不过都一样
str3str4指向的是一个
指针数组
int*arr【3】存放整形指针的数组
这样可以打印出所有元素
printf("%d',*(arr[i]+j));
printf("%d",arr[i][j]);
等价
数组指针
是一种指针 指向数组的指针
int a=10;
int *pa=&a;
char ch='w';
char*pc=&ch;
double*d[5];
double*(*pd)[5]=&d;
//int arr[10]={1,2,3,4,5};
//arr数组名是首元素地址 arr[0]的地址
//&arr取出的是数组的地址
//int *(parr)[10]=&arr; //parr就是一个数组指针 其中存放的是数组的地址
&数组名vs数组名
int arr[10]={0};
printf("%p\n,"arr);
printf("%p\n,"&arr); //结果一样 但是意义不同
int*p1=arr; //整形指针
int(*p2)[10]=&arr; //数组指针
printf("%p\n",p);
printf("%p\n,p1+1); //p1是整形数组+1跳过4个字节
printf("%p\n",p2);
printf("%p\n,p2+1); //p2+1跳过一个数组
前两行相差4
后两行相差2和8即40 40也是数组10个元素的总大小
情况2数值相同而已
int arr[3][5]={{1,2,3,4,5},{2,3,4,5,6},[3,4,5,6,7}}
void print2(int(*p)[5],int r,int c)
{
int j=0;
int j=0;
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
打印 *(*(p+i)+j); //p指向位置如图 p+1指向arr[1]位置 通过加I可以选行
} //*(p=i)选行 +j选列
} //p是一整行的首元素一次直接跨过一行 解引用之后 加j只跨过一个元素
}
parr1 此数组意义为整形指针 每个数组元素都是地址 即每个元素类型是int*
parr2是数组指针 该指针能够指向一个数组数组元素有十个每个元素的类型是int
parr3 parr3是一个存放数组指针的数组 该数组能存放10个数组指针 每个数组指针能指向一个数组数组五个元素 每个元素是int类型
数组参数 指针参数
一位数组传参
前两个函数传参 可以写成test(arr) 也可以写成test(arr2)
传入void test(int*arr) 也可以用test(arr) 因为是把数组首元素地址传过去了 符合int*
一维数组传参 数组可忽略元素值 可以传地址
三种形式都行
arr2存放int*的指针符合 test2(arr2)符合
类比test1和arr1 test2(arr2)取出来arr2首元素地址 首元素本身是int* 则取出来的是二级指针 符合
二维数组传参
行可省略 列不能省略
直接用test(arr)传的是首元素的地址是第一行的地址(二维数组可以分成行元素 首地址就是第一行的元素)是一维数组一整行的地址 但是要求的是一个元素的地址所以不行
也不行 要求参数是 一位数组 更不行
行 参数要求是能指向五个元素的数组指针 符合要求
不行 传过去的不是二阶指针 是第一行的地址