1.数组名的理解
(1)数组名本身就是地址(数组首元素的地址)
eg. arr 等价于 &arr[0]
特例:1):sizeof(数组名),此时的数组名表示整个数组,sizeof计算的是整个数组的大小,单 位为字节。
2): &数组名,此时的数组名也表整个数组,取出的是整个数组的地址(在+/-整数时以整 个数组的大小为单位)。
eg. int arr[10]
&arr = 012FF774 arr = 012FF774 &arr[0] = 012FF774
&arr+1= 012FF79C arr+1= 012FF778 &arr[0]+1= 012FF778
*指针类型决定了指针+/-整数时的步长:&arr[0] --------> int*,arr--------> int*,&arr--------> int(*)[10]
2.使用指针访问数组
(1) arr [ i ] == *(arr + i) 这是完全等价的。
(2)罕见的写法
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
int* p = arr;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
//printf("%d ", arr[i]);
//printf("%d ", *(arr+i));
//printf("%d ", *(i+arr));
printf("%d ", i[arr]);
}
return 0;
}
3.一维数组传参本质
典例 :
#include <stdio.h>
void test(int arr[10])//int* arr
{
int sz2 = sizeof(arr)/sizeof(arr[0]);
printf("sz2=%d\n", sz2);
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10};
int sz1 = sizeof(arr) / sizeof(arr[0]);
printf("sz1=%d\n", sz1);
test(arr);
return 0;
}
为什么sz1与sz2同样的代码,结果却不同呢?——因为一维数组传参时,传的是数组名,本质上传递的是数组首元素的地址。因此,函数的形参部分是不会真实创建数组的,那么这里也就不需要传递数组大小 。函数的形参部分应用指针变量来接收。
*注:一维数组传参时,形参写成数组形式主要是为了方便理解。
4.二级指针
(1)二级指针实际上就是指向一级指针的指针,以此类推多级指针。
int main()
{
int a=10;
int* pa=&a;//pa为指针变量,一级指针变量
int** ppa=&pa;//ppa就是二级指针变量,用于存放一级指针的地址
return 0;
}
5.指针数组—存放指针的数组
(1) int* arr[3] ——存放整形指针的数组,char* arr[8] ——存放字符指针的数组
*同普通数组类似,这里的int*,char*和int,char类似,用于表示数组内元素的数据类型。
6.指针数组模拟二维数组
典例:
#include <stdio.h>
int main()
{
int arr1[] = { 0,1,2,3,4 };
int arr2[] = { 3,4,5,6,7 };
int arr3[] = { 6,7,8,9,10 };
int* arr[] = { arr1,arr2,arr3 };
for (int i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
printf("%d ", *(*(arr+i))+j);//(arr+i)找到一维数组,进而找的数组内的元素
}
printf("\n");
}
return 0;
}
7.字符指针变量
(1) const char* ps = "abcdef";(这种赋值是将首字符地址赋给ps,这是常量字符串,不可修改,也是一块连续的空间)
不同于 char arr[ ]="abcdef";(非常量字符串)
char* ps = arr;
典例:
#include <stdio.h>
int main()
{
char str1[] = "hello";
char str2[] = "hello";
const char* str3 = "hello";
const char* str4 = "hello";
if (str1 == str2)
printf("同\n");
else
printf("不同\n");
if (str3 == str4)
printf("同\n");
else
printf("不同\n");
return 0;
}
为什么会出现这样的结果呢?请看图解:
*str3和str4指向的是常量字符串,内存中不会再开辟一块空间存放相同的常量字符串,因此str3和str4共同指向同一个地址 。
——指针(三)