对指针的一些理解

一、基本概念

指针 可以当作它就是地址  所以 指针变量的含义也可以指他就是一个地址变量 他指向的是地址

一个指针变量的大小为4byte/8byte(32位/64位)

存储时 数据传进来的都是地址 而不是它的值 就比如 char* ch="hellow world"; 它实质上是有十个字节(字符加上一个空格加上一个\0) 但是在存储时他只是将h的首地址传进去 

所以在printf("%c\n",*ch);时输出的就是h 指针类型即指它所指向的数据类型 也是指针可访问字节的大小 

 跟数组相比 例如:char arr[]="hello world"; printf("%s",arr); 这个arr与ch解引用时相似的 arr存储的是首元素的地址(arr[0]) 那么在打印字符串时(打印字符串 传入首地址 就可以打印出整个字符串) 就会直接输出 hello world 同prinf(”%s”,ch);传入的是首地址 就可以直接打印字符串

char*ch="hello world"; 是一个常量字符串 更改不了

*ch=’w‘; 程序会挂掉 更改不了

char arr[]="hello world"; 是数组字符串 可以更改

arr[0]='w' 可以更改

所以 对于char arr1[]="hello world"; char arr2[]="hello world"; 此时是创建了两个数组 所以arr1和arr2是不相同的

而char*ch1="hello world"; char*ch2="hello world";  这个hello world 是常量字符串 所以只会创建一个  ch1 ch2两个不同的指针指向同一个首地址

二、指针数组

存放指针的数组

int *arr[5];一个存放整型指针的数组

三、数组指针

是一种指针

int arr[10]={1,2,3,4,5,6};

int(*parr)[10]=&arr; 这是存储的才是arr的地址

parr就是一个数组指针

而arr是首元素的地址与&arr两者不同

数组名表示首元素的地址 但是有两个例外:

1.sizeof(数组名) 此时数组名表示整个数组 计算的是整个数组的大小

2.&数组名 此时数组名也表示整个数组 取出的是整个数组的地址

对于二维数组 首元素是第一行 所以二维数组名代表的是第一行的元素

例如 int arr[2][2] ={ {1,2},{2,3}}; 如果取地址的话 就是取的第一行的元素即 &arr  --->int arr[2]

所以二维数组指针:int (*pd)[2] 就是指向该数组的二维数组指针。

 int arr[10];  //表示整型数组 存放 十个元素

int*arr[10];// 指针数组 存放十个整型指针

int (*arr)[10];//数组指针 指向一个存储十个元素的数组的一个指针

int (*arr[10])[10];// 可以理解为 int(*)[10]  arr[10]  为一个存储数组指针的数组 arr就是一个存储十个数组指针  每个数组 指针指向一个 元素为10的数组

四、数组传参

1.一维数组传参

int main(){

int a[20]={0};

int *b[20]={0};

test1(a);

test2(b)

}

用数组接收:

void test1(int a[]){}; //传进来的是数组 用数组接受

void test1(int a[20]){};//同上

用指针接收:

void test1(int *a){};//传进来的是数组首元素的地址 该元素是(int型的地址) 用int类型的指针接收

void test2(int *b[20]){};//传进来的是指针数组 用指针数组接收

void test2(int **b){};//传进来的是首个指针的地址 用 二级指针接收(传进来的是int *类型的地址,用指针接收)

 以上都可以进行数组的传参

2.二维数组传参

int main(){

int a[2][3]={0};

test(a);

}

用数组接收

void test(a[2][3]){} //传的二维数组 用二维数组接受

void test(a[2][]){}//错误 因为行不能省略 跟定义二维数组时一样 不能省略行 只能省略列

void test(a[][]){}//错误

void test(a[][3]){}// 可行

 用指针接收

void test(int *a){}//二维数组数组名表示的是二维数组的第一行 不是一个元素  不可行

void test(int *a[3]){}//此时用存放指针的数组接收 传进来的是 数组 不可行

void test(int(*a)[3]){} //此时表示是a指针是一个指向数组大小为3 类型为int的地址 跟传进来的参数符合 可行

void test(int **a){}//一个指向int*的指针

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值