C语言指针 喜欢ヅ旅行 2022-03-26 05:22 317阅读 0赞 1、指针的基本知识 (1)定义 int \*p; (2)赋值 1) int a;int *p=&a 2) int a ;int *p;p=&a 下面的赋值方法是 错误的;不允许将具体的数值进行赋值;被赋值的指针变量前不能再添加\*; 1)int *p;p=1000; 2)int *p;int a;*p=&a -------------------- 赋值运算 1)初始化 2)变量地址赋值指针 int a,*pa;pa=&a; 3)同类型指针赋值 int a,*pa=&a,*pb; pb=pa; 4)把数组的首地址赋值指向数组的指针 int a[5],*pa; pa=a;(数组名表示数组的首地址) pa=&a[0]; 5)把字符串的首地址赋值指针 char *pc;pc="C language"; char *pc="C language"; 上述两种方法都可以正确执行,这里并不是把整个字符串装入指针变量,而是把存放该字符串的字符数组的首地址装入指针变量。 6)把函数的入口地址赋值指针 int (*pf)();pf=f;(f是函数名) (3)指针变量的运算 1)取地址运算符 &; 2)取内容运算符 \*;(此处的符号与指针定义的星号表示意义不同,指针定义时候星号表示类型说明符;此处星号表示运算符) int main() { int a=5;*p=&a;//此处表示类型说明符 printf("%d\n",*p);//此处表示运算符 } (4)算术运算 pa+n;pa-n;pa++;pa--; int a[5],*pa; pa=a;//指向a[0] pa=pa+2;//指向a[2] `(pf1-pf2)/sizeof(pf1的类型)`:表示指针所指向元素的个数; `pf1+pf2` 毫无意义; pf1==pf2; pf1>pf2; pf1<pf2; (5)指针与0比较 #define NULL 0; int *p=NULL; 指针变量未赋值时,可以为任意值,是不能够使用的,俗称“野指针”。 而指针变量赋值0值后,则可以使用,只是它不指向具体的变量而已。 特别是在释放动态申请的内存后,free(q);q此时就是一个“野指针”,所以一般在free之后,添加q=NULL;安全写法。 (6)数组指针变量 设定数组a,指向a的指针变量为pa; 则: `pa,a,&a[0]`均为同一单元,为数组a的首地址; `pa+1,a+1,&a[1]`均指向1号元素a\[1\]; 类似`pa+i,a+i,&a[i]`均指向数组a\[i\]; 故: `*(pa+i),*(a+i),a[i]`相等; 在数组名和数组指针做函数参数时候,实参向形参传递的是数组的首地址,形参得到地址后也是指向同一数组。因此在函数中对形参数组的操作,也等同于对实参数组的操作。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jhb2JpbmdqaQ_size_16_color_FFFFFF_t_70] (7)多维数组指针变量 a[3][4]={ 0,1,2,3, 4,5,6,7, 8,9,10,11}; 设a数组的首地址为1000; a可以分为3个一维数组a\[0\],a\[1\],a\[2\]; 每个一维数组都会有4个元素:a\[0\]---->a\[0\]\[0\],a\[0\]\[1\],a\[0\]\[2\],a\[0\]\[3\]; 数组以及数组元素表示如下: a是一个二维数组,1000; a\[0\]是第一个一维数组的数组名和首地址,1000; &a\[0\]\[0\]是一个二维数组a的0行0列元素首地址,1000; 因此,`a,a[0],*(a+0),*a,&a[0][0]`相等; 同理,`a+1,a[1],*(a+1),&a[1][0]`相等; 故:`a+i,a[i],*(a+i),&a[i][0]`相等; 此外,`&a[i],a[i]`相等。 取元素值: `a[i]+j`表示一维数组a\[i\]的j号元素地址,与`&a[i][j]`相等, 因为`a[i]=*(a+i);` 故:`a[i]+j=*(a+i)+j;` 所以元素值为`*(*(a+i)+j)` 设p为指向二维数组的指针变量,可定义为: `int (*p)[4]`,表示p是一个指针变量,它指向二维数组a或指向第一个一维数组`a[0]`,其等于`a,a[0][0],*(a+0),&a[0]`; `p+i`则指向一维数组`a[i],*(p+i)+j`是二维数组i行j列元素地址,而`*(*(p+i)+j)`则是i行j列的元素值。 指向多维数组的一般表示: 类型说明符 (\*指针变量名)\[长度\],长度表示多维数组分解成多个一维数组时,一维数组的长度,即二维数组的列数。 void main() { int a[3][4]={ 0,1,2,3, 4,5,6,7, 8,9,10,11}; int (*p)[4]; int i,j; p=a; for(i=0;i<3;i++) { for(j=0;j<4;j++) { printf("%d \n",*(*(p+i)+j)); } } } 注意:`int a[3][4];int *p;p=a;`这段代码是错误的,因为a是一个二维数组,即数组的数组,此处将其转换成一个指向数组的指针,而p是一个指向整型变量的指针,将一种类型的指针赋值给另一种类型的指针,是非法的。 (8)指针数组 一般形式: 类型说明符 \*数组名\[长度\] int \*pa\[3\];表示pa是一个指针数组,它有3个元素,每个元素都一个指针,指向整型变量。 通常可用一个指针数组来指向一个二维数组,指针数组中的每一个元素被赋值与二维数组的每一行首地址。 int a[3][3]={ 1,2,3,4,5,6,7,8,9}; int *pa[3]={ a[0],a[1],a[2]}; int *p=a[0]; void main() { int i; for(i=0;i<3;i++) { printf("%d,%d,%d\n",a[i][2-i],*a[i],*(*(a+i)+i)); } for(i=0;i<3;i++) { printf("%d,%d,%d\n",*pa[i],p[i],*(p+i)); } } int (\*p)\[3\]----------------------A; int \*p\[3\]------------------------B; A与B的区别: A是表示p是一个多维数组指针; B是表示p是一个指针数组; (9)函数指针变量 c语言中规定,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。 因此,可以把函数的首地址(入口地址)赋值与一个指针变量,使得该指针变量指向该函数,然后通过指针变量即可找到函数。 一般定义: 类型说明符 (\*指针变量名)();()表示指针变量所指向的是一个函数; eg: int (\*pf)();pf是一个指向函数入口的指针变量,该函数返回值是整型。 int max(int a,int b) { if(a>b) return a; else return b; } void main() { int max(int a,int b); int (*pmax)(); int x=1,y=2,z; pmax=max; z=(*pmax)(x,y); printf("%d \n",z); return 0; } (10)指针型函数 C原因中允许一个函数返回值是一个指针(即地址). 类型说明符 \*函数名(形参表) \{…\} int (\*p)()----------------------A; int \*p()------------------------B; A与B的区别: A是变量声明,说明p是一个指向函数入口的指针变量,该函数的返回值是整型; B是函数声明,说明p是一个指针型函数,其返回值是一个指向整型量的指针; [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jhb2JpbmdqaQ_size_16_color_FFFFFF_t_70]: /images/20220326/f7c52cc2ba37467eb9bbecd62f62fc21.png
相关 C语言指针 C语言指针 1、 指针概述: 1、指针是一种数据类型,占用内存空间。用来保存内存地址。 2、空指针: 标准定义了NULL指针,它作为一个特殊的指针变量, Bertha 。/ 2023年05月31日 07:56/ 0 赞/ 6 阅读
相关 【C语言】指针 50、指针变量用来记录地址数据 51、只有记录了有效地址的指针变量才可以使用 52、声明指针变量时需要在变量名称前写\ 53、指针变量名称前加\可以表示指针所捆绑的存储区 亦凉/ 2022年06月12日 04:49/ 0 赞/ 272 阅读
相关 c语言指针 //指针怎么用 // (区分两个概念,指针变量和指向内容,指针变量只保存一个地址值,在这个地址值对应的内存中具体存放的东西叫做指向内内容) 用变量 ╰半夏微凉°/ 2022年06月04日 08:58/ 0 赞/ 283 阅读
相关 C语言指针 C语言中,指针尤为重要。 1可以把指针看作是一个数据类型。 ![SouthEast][] 打印结果: ![SouthEast 1][] 2 在指针声 今天药忘吃喽~/ 2022年05月31日 03:39/ 0 赞/ 274 阅读
相关 C 语言指针 1、CPU 访问内存,是通过内存地址来读写内存数据的,CPU 与内存条硬件之间有个地址总线,CPU 通过地址总线将要访问/写入的内存地址告诉内存条。 2、对于 CPU 而言地 拼搏现实的明天。/ 2022年05月29日 01:54/ 0 赞/ 307 阅读
相关 C语言指针 1、指针的基本知识 (1)定义 int \p; (2)赋值 1) int a;int p=&a 2) int a ;int p; 喜欢ヅ旅行/ 2022年03月26日 05:22/ 0 赞/ 318 阅读
相关 C语言:指针 今天研究了一下午终于把指针研究明白了 include<stdio.h> include<stdlib.h> int main() { 快来打我*/ 2022年03月25日 21:14/ 0 赞/ 331 阅读
相关 C语言-指针 1.指针和指针变量 > 内存区的每一个字节都有编号,这就是地址 > 如果在程序中定义了一个变量,在对程序进行编译和运行时,系统就会给这个变量分配内存单元,并确 àì夳堔傛蜴生んèń/ 2022年01月26日 11:17/ 0 赞/ 382 阅读
相关 C语言指针 变量的地址 我们已经知道,内存变量简称变量,在C语言中,每定义一个变量,系统就会给变量分配一块内存,而内存是有地址的。如果把计算机的内存区域比喻成一个 小咪咪/ 2021年11月10日 23:06/ 0 赞/ 490 阅读
还没有评论,来说两句吧...