一.指针基础
1. 指针的多种理解:指针是一种类型,可以定义指针类型的变量;指针就是内存地址,因为它指向了内存空间;指针说的就是指针变量
2 .指针的两种类型:本身的类型、指向的类型
3. 指针的大小:指针的大小、所能访问的指向空间的大小
ps: sizeof(p) 如32位4个字节,64位8个字节 ;
sizeof(*p)如int *p为4、char *p 为1
4. PS:C语言中没有字符串类型,所以用字符数组来模拟实现字符串
字符串默认会带有结尾标志‘\0’(等价于数字0,但是要与字符零‘0’区分开),针对字符串的所有操作都是以结尾标志作为标识的
char str[]="abc"; 默认为abc后面有\0, eg:
char *strcpy(char *dest ,char *str) 功能:将str字符串的内容拷贝到dest空间中
5. 字符串给指针进行初始化赋值时,实际上赋值的是常量字符串的地址;字符数组进行字符串的初始化赋值时,赋值的是字符串的内容。eg:
int main()
{
char str1[] = "abc";
char str2[] = "abc";
if (str1 == str2)
printf("str1==str2\n");
else printf("str1!=str2\n");//str1!=str2 两个字符串开辟了俩个空间,两个字符串不同
char* ptr1 = "abc";
char* ptr2 = "abc";
if (ptr1 == ptr2)
printf("ptr1==ptr2\n");
else printf("ptr1!=ptr2\n");//ptr1==ptr2 运用的是指针,因为两个字符串内容相同,所以指向的是同一块地址,所以俩个量相同
}
详细解释:
6. 字符数组的输出可以使用%s直接传入首地址进行输出(如char str[]="abc"; printf("%s",str); );但其它的数组的数据输出,不能只是用首地址,需要遍历操作(如使用for循环来打印)
7.无类型指针 void *:
void是无类型,通常用于定义函数的返回值类型或者参数的类型,表示没有返回值或者参数。
void*是无类型指针,通常用于表示无关大小的指针类型,只关心指向的指针类型。
8. 指针数组:本质是一个数组,只不过数组的每一个元素都是一个指针。
eg: 指针:int *p 数组: int arr[10]
--> 指针数组: int *parr[10]; -->含义:先表示一个数组,然后表示数组中的元素都是一个指针,而这个指针是整型指针。
eg: 定义一个具有20个元素的字符指针数组:char *arr[20];
9.数组指针:是一个指针,指向类型是一个数组。
eg: int (*p)[10]; p是一个指针,指向了一个具有10个整型元素的数组
eg: 定义一个具有10个整型指针元素的数组指针:int *(*p)[10];
eg:
10.数组名 和 &数组名
数组名:数组首元素的地址
对数组名取地址:数组的地址(即数组指针)
通常数组名再大多数使用场景都被认为是数组首元素的地址。但有两个场景不同:
1.数组名取地址 2.sizeof(数组名)
PS:数组名是数组之间的,指针是一块空间,两者是有差别的
eg: int arr[10];
arr +1 :数组第一个元素的地址
&arr+1:跳过整个数组,指向最后一个元素的结尾处
ps:
二.数组传参
1.一维数组传参
2.二维数组传参:二维数组传参,函数形参的设计只能省略第一个[ ]的数字(因为对一个二维数组可以不知道有多少行,但必须知道一行有多少个元素,这样算才能简便),如: