内存中地址分配方法
- 内存中地址分配是以字节为单位的
- 即:每一个字节都有唯一一个地址
例如:
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* parr1[10];
//parr1是一个指针数组,有10个元素,每个元素是int*类型(int型指针)
int(*parr2)[10];
//parr2是一个数组指针,指向的是int[10]类型的数组,指向的数组有10个元素,每个元素是int类型。
int(*parr3[10])[5];
//parr3是一个数组,数组有10个元素,每个元素类型是int(*)[5],每个元素存放的是数组指针。
数组指针
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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。