内存中地址调配办法
- 内存中地址调配是以字节为单位的
- 即:每一个字节都有惟一一个地址
-
例如:
int a = 0x12345678; // 如果 a 的地址是 0xffff4444 // 如果是小端存储 低地址 44 44 ff ff 高地址 // 那么以 char 类型解援用 0xffff4445 地址的数据,失去的是 0x44。
字符指针
char* p1 = "abcde";
char* p2 = "abcde";
- 上述两个变量定义初始化,相当于创立一个字符串常量 abcde,而后将这个常量别离赋值给不同的指针,所以两个指针指向同一个地址
- 当定义两个雷同的常量字符串时,因为字符串 abcde 是常量字符串,不能被更改
- 所以在内存中是不会被创立两份的,只创立一份,两个变量共用。
- 所以,指针 p1 和指针 p2 都会指向同一个地址
char arr1[] = "abcde";
char arr2[] = "abcde";
- 这里是用 abcde 去初始化两个不同的数组,所以 arr1 不等于 arr2。
数组指针
int (*p)[10];// 定义数组指针
- 留神:* p 这里必须打括号,因为 [] 的优先级高于星号,所以必须加上括号保障 p 先与星号联合。
- 它指向一个大小为 10 个 int 型的数组。
数组名和 & 数组
int arr[10] = {0};
printf("%p\n",arr);
printf("%p\n",arr[0]);
printf("%p\n",&arr);
// 三个输入后果雷同
// 然而 arr 代表的是数组首元素地址,代表一个 int 元素的大小,它是 int* 类型。//&arr 代表的是数组的地址,代表整个数组的大小,它是数组指针类型 int (*)[10]
// 它们代表的范畴不同
int* a = arr;
int (*p)[10] = &arr;
p 是一个指针,只占 4 个字节,指向一个数组(指向的是数组而不是数组的首元素)
char* arr[5];
p = &arr;
// 指针 p 的类型为:char* (*p)[5]
//(*p)示意 p 是一个指针
//[5]示意指向的是大小为 5 的数组
//char* 示意指向的数组是 char* 型
int* arr[10]; //arr[0] 是 int* 型,arr 是 int** 型
int* (*p)[10] = &arr;
//p 是数组指针,指向的是 arr 整个数组,范畴是整个数组
//* p 解援用,解进去的是数组首元素的地址,相当于 arr(int** 类型)//*(*p) 解进去是数组首元素,相当于 arr[0](int* 类型)
数组指针在二重数组中的利用
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int print(int(*p)[5])
{for (int i = 0; i < 3; i++)
{for (int j = 0; j < 5; j++)
{printf("%d", *(*(p + i) + j));
}
printf("\n");
}
return 0;
}
int main()
{int arr[3][5] = {{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
print(arr);
return 0;
}