一、基本概念
指针 可以当作它就是地址 所以 指针变量的含义也可以指他就是一个地址变量 他指向的是地址
一个指针变量的大小为4byte/8byte(32位/64位)
存储时 数据传进来的都是地址 而不是它的值 就比如 char* ch="hellow world"; 它实质上是有十个字节(字符加上一个空格加上一个\0) 但是在存储时他只是将h的首地址传进去
所以在printf("%c\n",*ch);时输出的就是h 指针类型即指它所指向的数据类型 也是指针可访问字节的大小
跟数组相比 例如:char arr[]="hello world"; printf("%s",arr); 这个arr与ch解引用时相似的 arr存储的是首元素的地址(arr[0]) 那么在打印字符串时(打印字符串 传入首地址 就可以打印出整个字符串) 就会直接输出 hello world 同prinf(”%s”,ch);传入的是首地址 就可以直接打印字符串
char*ch="hello world"; 是一个常量字符串 更改不了
*ch=’w‘; 程序会挂掉 更改不了
char arr[]="hello world"; 是数组字符串 可以更改
arr[0]='w' 可以更改
所以 对于char arr1[]="hello world"; char arr2[]="hello world"; 此时是创建了两个数组 所以arr1和arr2是不相同的
而char*ch1="hello world"; char*ch2="hello world"; 这个hello world 是常量字符串 所以只会创建一个 ch1 ch2两个不同的指针指向同一个首地址
二、指针数组
存放指针的数组
int *arr[5];一个存放整型指针的数组
三、数组指针
是一种指针
int arr[10]={1,2,3,4,5,6};
int(*parr)[10]=&arr; 这是存储的才是arr的地址
parr就是一个数组指针
而arr是首元素的地址与&arr两者不同
数组名表示首元素的地址 但是有两个例外:
1.sizeof(数组名) 此时数组名表示整个数组 计算的是整个数组的大小
2.&数组名 此时数组名也表示整个数组 取出的是整个数组的地址
对于二维数组 首元素是第一行 所以二维数组名代表的是第一行的元素
例如 int arr[2][2] ={ {1,2},{2,3}}; 如果取地址的话 就是取的第一行的元素即 &arr --->int arr[2]
所以二维数组指针:int (*pd)[2] 就是指向该数组的二维数组指针。
int arr[10]; //表示整型数组 存放 十个元素
int*arr[10];// 指针数组 存放十个整型指针
int (*arr)[10];//数组指针 指向一个存储十个元素的数组的一个指针
int (*arr[10])[10];// 可以理解为 int(*)[10] arr[10] 为一个存储数组指针的数组 arr就是一个存储十个数组指针 每个数组 指针指向一个 元素为10的数组
四、数组传参
1.一维数组传参
int main(){
int a[20]={0};
int *b[20]={0};
test1(a);
test2(b)
}
用数组接收:
void test1(int a[]){}; //传进来的是数组 用数组接受
void test1(int a[20]){};//同上
用指针接收:
void test1(int *a){};//传进来的是数组首元素的地址 该元素是(int型的地址) 用int类型的指针接收
void test2(int *b[20]){};//传进来的是指针数组 用指针数组接收
void test2(int **b){};//传进来的是首个指针的地址 用 二级指针接收(传进来的是int *类型的地址,用指针接收)
以上都可以进行数组的传参
2.二维数组传参
int main(){
int a[2][3]={0};
test(a);
}
用数组接收
void test(a[2][3]){} //传的二维数组 用二维数组接受
void test(a[2][]){}//错误 因为行不能省略 跟定义二维数组时一样 不能省略行 只能省略列
void test(a[][]){}//错误
void test(a[][3]){}// 可行
用指针接收
void test(int *a){}//二维数组数组名表示的是二维数组的第一行 不是一个元素 不可行
void test(int *a[3]){}//此时用存放指针的数组接收 传进来的是 数组 不可行
void test(int(*a)[3]){} //此时表示是a指针是一个指向数组大小为3 类型为int的地址 跟传进来的参数符合 可行
void test(int **a){}//一个指向int*的指针