内存中地址调配办法

  • 内存中地址调配是以字节为单位的
  • 即:每一个字节都有惟一一个地址
  • 例如:

    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;}