大家好,欢迎来到IT知识分享网。
C语言指针
大家好这里是Jasmine,以下内容是我在指针相关的学习期间,并收集网络上的讲解视频,对指针板块的总结与理解。
在这与大家分享,如果有任何错误,恳请各位前辈大佬指出。
何为指针
1、指针就是地址
声明:指针类型 * 指针名=……(int*a=……)
1)名字的意义
*a 表示的对a指向的地址进行解引用。
a表示的是指针本身,&a也表示的室指针,单独的数组名:
arr表示的是数组内首元素的地址,&arr表示的是整个数组的地址
2)指针类型的意义
1、决定了指针一步能走多远(int 4、double 8、char 1) 2、决定了指针解引用的权限
图解说明(图片来源自网络寻找)
代码编写时遇到的易错点:在进行比较时,就要让两者要么同为值,要么同为指针(地址)
# include <stdio.h> int main() { #define N_myarr 5 float myarr[N_myarr]; float* p7=myarr; for (float*p7 = &myarr[0];p7 < & myarr[N_myarr];) //这里括号内不用*p7的原因是,*p7是一个值,p7才是指针. //& myarr[N_myarr]也表示的是地址 { *p7++ = 1;//将当前元素的值设为1,然后将指针p7向后移动一位.*p7=1;p7++ } return 0; }
2、指针报错的几种可能性
1)非法访问
如下例:此时的y是一个野指针
int* y;//局部指针变量,局部变量没有初始化时,默认是随机值。
*y = 20;//非法访问内存。
2)越界访问:常见在数组中
#include <stdio.h> int main() { int arr2[10] = { 0 }; int* p4 = arr; int m = 0; for (i = 0;i <= 10;i++) { *p4 = i; p4++;} /*此时也会出现野指针,因为当i=10时,再次进入循环,此时p4已经加了11,相当于一共移动了44个字节。而数组此时只能容纳四十个字节的,多出来的四个字节便成为了野指针。*/ return 0; }
3) 指针指向的空间释放,常见于调用函数中。
指针成为了形式参数
# include <stdio.h> int *test() { int a=10; return &a; } int main () { int *p=test();//这一步开始调用a,然后立刻销毁。 *p=20;//此时a以及销毁,不能被使用。所以不能这样通过P来调用a. return 0; }
3、指针的大小
1)指针变量的大小是相同的,32位的是4字节,64位是8字节。
2)指针需要多大位置取决于地址的存储空间多大。int:4 char:1 double8:
4、指针的运算
指针之间计算特殊说明:允许指向数组元素的指针与指向最后一个元素后面的内存位置的指针进行比较,但不允许与第一个元素前面的内存位置的指针进行比较。
1、指针+/-整数
表示的是步长
2、指针-指针
表示的是相差的元素间隔,可理解为步数
int arr4[10] = { 1,2,3,4,5,6,7,8,9,12 }; printf(“%d\n”, &arr[9] – &arr[0]); //最终得到的是9
5、指针与字符串
C语言中会将字符串以数组的形式存在
#include <stdio.h> int main() { char* pc = "hello c"; char arr[] = "hello c"; printf("%s\n", pc);//这里需要的就是首字母地址,不需要解引用得到首字母。所以不用*。 printf("%s\n", arr);//%s 是用来表达字符串的,它期望接收到一个指向字符数组(以 \0 结尾)的指针。 //当你传递一个字符数组(字符串)时,它会打印出从该地址开始的所有字符,直到遇到空字符为止。 printf("%c\n", *pc);//这个格式说明符用于输出单个字符。 return 0; }
6、指针与函数
函数指针:指向函数的指针
1、&函数名or函数名,取到的就是函数的地址,要用%p进行输出。
2、声明方式:返回类型 (*指针名)(调用的参数类型)=&函数名称;此时就称指针名为一个函数指针
函数指针便于随时调用函数
# include <stdio.h> int Add(int x,int y) { return x+ y; } int main() //pf就是一个函数指针变量 { int(*pf)(int,int)= &Add int ret=(*pf)(3,5); printf("&d\n",ret); return 0; }
7、指针与数组
指针数组
仍然是数组
# include <stdio.h> 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[3] = { a,b,c }; for (int i = 0;i < 3;i++) { for (int j = 0;j < 5;j++) { printf("%d", arr [i][j]); /*类似于二维数组,可以对其直接访问,不需要解引用 表达式 arr[i][j] 实际上是使用了指针算术来访问元素。它相当于 *(*(arr + i) + j) 或者写成:printf("%d",*(arr[i]+j));*/ } printf("\n"); } return 0; }
数组指针
是一个指针,但指向一整个数组
int main() { int arr[10] = { 1,2,3,4,5,6,7 }; int(*parr)[10] = &arr;//此时parr为一个数组指针 for(int i =0;i<7;i++) { printf("%d\n",*((*parr)+i)); // 此时将*parr[10]看成一个整体,则*parr就相当于arr,就是首元素的地址。 } return 0; }
当指针指向数组后,那么*指针名称就与数组名代表的含义等价,都是数组首元素。
如: int(*parr[10])[5]:存放数组指针的数组。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/120494.html
