我是靠谱客的博主 妩媚歌曲,这篇文章主要介绍【C语言】指针的进阶指针概念字符指针指针数组数组指针&数组名和数组名的区别,现在分享给大家,希望可以做个参考。

目录

指针概念

字符指针

例题

指针数组

数组指针

&数组名和数组名的区别

数组指针的使用

数组传参

一维数组传参

二维数组传参

一级指针传参

二级指针传参


指针概念

1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。

2. 指针的大小是固定的4/8个字节(32位平台/64位平台)。

3. 指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时候的权限。

4. 指针的运算。

字符指针

就是指向字符地址的指针

复制代码
1
2
3
4
5
6
7
8
9
10
//字符指针 int main() { char *p = "abcdef";//常量字符串 printf("%cn",*p); printf("%sn",p); return 0; }

指针p中我们并没有将整个字符串存入,只是存放了首字符地址

注意:我们这里的‘abcdef’是常量字符串,常量字符串是不可以被修改的,为了防止犯错我们在常量字符串前加const   例:const *p = "abcdef";

例题

我们先判断一下str1和str2是否相同,str3和str4是否相同

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main() { char str1[] = "hello world."; char str2[] = "hello world."; char *str3 = "hello world."; char *str4 = "hello world."; if(str1 ==str2) printf("str1 and str2 are samen"); else printf("str1 and str2 are not samen"); if(str3 ==str4) printf("str3 and str4 are samen"); else printf("str3 and str4 are not samen"); return 0; }

 答案很明显str1和str2不相同,str3和str4相同。

str1和str2是两个数组所占的空间不同,首字符地址也不同

str3和str4指向同一个常量字符串,实际上是指向同一块内存。所以str3和str4相同

指针数组

存放指针的数组叫指针数组。

本质上是数组,存放的是指针(地址)

例:int * ch[3]一个数组ch中有3个元素每个元素类型是int*

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()//指针数组 { int a[5] = { 1,2,3,4,5 }; int b[] = { 2,3,4,5,6 }; int c[] = { 3,4,5,6,7, }; int* arr[] = { a,b,c }; for (int i = 0; i < 3; i++)//有三个数组所以i =3 { for (int j = 0; j < 5; j++)//每个数组中有5个元素 { printf("%d ", *(arr[i] + j));//这行代码可以等于arr[i][j] } printf("n"); } return 0; }

int* arr[]中存放的是数组a,b,c的首元素地址

数组指针

指向数组的指针,是指针

整形指针: int * pint; 能够指向整形数据的指针。

浮点型指针: float * pf; 能够 指向浮点型数据的指针。

例    p1和p2分别是什么

复制代码
1
2
int *p1[10]; int (*p2)[10];

p1:是在数组 p1中有10个元素每个元素的类型是int*

p2:是一个指针,指向数组名为p2的数组,数组中有10个元素,每个元素的类型是int

注意:[]的优先级要高于*号的,所以必须加上()来保证p先和*结合。

&数组名和数组名的区别

复制代码
1
2
3
4
5
6
7
8
9
int main() { int arr[10] = { 0 }; printf("arr = : %pn", arr); printf("&arr = : %pn", &arr); printf("arr + 1 = : %pn", arr + 1); printf("&arr + 1 = : %pn",&arr + 1); return 0; }

根据上面的代码我们发现,其实&arr和arr,虽然值是一样的,但是意义应该不一样的。

实际上: &arr 表示的是数组的地址,而arr表示的数组首元素的地址

数组的地址+1,跳过整个数组的大小,所以 &arr+1 相对于 &arr 的差值是40. 

数组名是数组首元素的地址,但是有2个例外:

  1. sizeof(数组名) - 数组名表示整个数组,计算的是整个数组大小,单位是字节
  2. &数组名 - 数组名表示整个数组,取出的是整个数组的地址

数组指针的使用

 

 

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void test(int(*arr)[4], int x, int y) { int i = 0; int j = 0; for (i = 0; i < x; i++)//i数组行数 { for ( j = 0; j < y; j++)//j每行中的元素 { printf("%d ", *(*(arr + i) + j));//*(arr + i)表示进入下一行。当然这一行代码也可以直接写成arr[i][j] } printf("n"); } } int main() { int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10}; test(arr, 3, 4);//arr取得是二维数组的首行数组的地址 return 0; }

学了指针数组和数组指针我们来一起回顾并看看下面代码的意思:

 int arr[5];//整形数组

int *parr1[10];//指针数组,数组名为parr1,有10个元素,每个元素的类型是int *

int (*parr2)[10];//数组指针,指针指向数组名为parr2的指针,有10个元素,每个元素的类型是int 

int (*parr3[10])[5];//数组指针数组,存放数组指针的数组,能存放10个数组指针,每个数组指针指向一个数组,数组有5个元素,每个元素是int类型

数组传参

一维数组传参

判断那些数组传参是可以的

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
void test(int arr[]);// 都是整形数组可以传参 void test(int arr[10]);//可以传参 void test(int* arr);//可以传参,参数是一个指针,而arr1是一个地址 void test2(int* arr[20]);//可以传参,都是指针数组 void test2(int** arr);//可以传参,arr2是指针数组,每个元素是int* 类型 int main() { int arr1[10] = {0}; //整形数组 int* arr2[20] = {0}; //指针数组 test(arr1); test2(arr2); return 0; }

二维数组传参

复制代码
1
2
3
4
5
6
7
8
9
10
void test(int arr[][]);//不可以传参,二维数组的第二个[]不能省略 void test(int arr[3][5]);//可以传参,都是二维数组 void test(int* arr)//不可以传参,int*arr接收的是首元素的地址,但二维数组的首元素地址是第一行的地址 void test(int(*arr)[5]);//数组指针可以接收 int main() { int arr[3][5] = {0}; test(arr); return 0; }

一级指针传参

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int print(int* p, int se) { int i = 0; for (i = 0; i < se; i++) { printf("%d ", *(p + i)); } } int main() { int arr[] = { 1,2,3,4,5,6,7,8,9 }; int* p = arr; int se = sizeof(arr) / sizeof(arr[0]); print(p, se);//一级指针p传给函数 return 0; }

实参传过去的是地址

二级指针传参

三种不同形式传参

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void test(int** p2) { **p2 = 20; } int main() { int a = 10; int* pa = &a;//pa是一级指针 int** ppa = &pa;//ppa是二级指针 //把二级指针进行传参呢? test(ppa); test(&pa);//传一级指针变量的地址 int* arr[10] = {0}; test(arr);//传存放一级指针的数组 printf("%dn", a);//? return 0; }

最后

以上就是妩媚歌曲最近收集整理的关于【C语言】指针的进阶指针概念字符指针指针数组数组指针&数组名和数组名的区别的全部内容,更多相关【C语言】指针内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(79)

评论列表共有 0 条评论

立即
投稿
返回
顶部