首页 > 软件 > C语言指针问题

C语言指针问题

软件 2024-07-12

C语言指针问题

一、如有定义char y[4]= "321"
则表达式 *y+2的值是'5' 。
分析:y是字符串数组首元素'3'的地址,*y的值就是字符'3',再加上2,就是字符'5'(也可以说是字符'5'的ASC码值)。
二、 如有定义char z[2][4]={"MAT", "LAB"};,
则表达式*(*z+2)的值是 'T'。
分析:z是二维字符串数组首字符串“MAT”的地址,*z的值就是“MAT”首元素字符'M'的地址,再加上2,就是字符'T'的地址,再取值,得到的就是字符'T'。
三、如有定义char y[4]="321",*py=&y[0],
则表达式*(py+2) 的值是'1' 。
解析:py是y(0) 的地址,py+2是地址加2,就等于y(2) 的地址了,再取值,得到元素y(2) 的值'1'。

C语言指针问题

1、ptr赋值为arr地址后指向第一个元素,即元素6.
2、*(ptr++) += 123;由于是右侧操作(递增后缀),所以先取ptr地址后再递增ptr,此时取得的地址还是第一个元素地址(递增后ptr指向第二个元素,也就是7,这是第一次递增),因此是对6+123=129,并保存原地址,即第一个元素地址,因此6被改为129。
3、输出时,由于printf为了左对齐参数格式,必须从右到左处理参数入栈,由于++ptr为左侧操作,因此先递增ptr,ptr指向第三个元素,这是第二次递增,然后取值,那么显然读取的数据为8、入栈,然后再处理左侧参数*ptr,此时ptr没有递增还是指向8,因此取得的还是8,入栈。因此输出都是8
PS:进入函数后,先退栈取值得到第一个参数,也就是后入栈的函数左侧参数,输出,再退栈取得第二个参数,也就是先入栈的函数右侧参数,输出。
这类前后++--的题实际很简单,先搞清楚优先级就行了,也就是搞清楚执行先后,左侧++--优先级最高,比如 a*++b--这样的表达式,不用看肯定是++优先,先处理++b再与a相乘,还比如a+++b,表达式解析时是从左到右,所以先判断为a的右侧操作,所以先取值后递增,取值后再与b相加。
其二,递增递减操作在变量左侧的会立刻影响当前取值,因为它是先运算再取值,而在右侧操作的会影响后续代码的变量取值,但不改变当前对变量的取值,因为在递增递减前当前取值已经完成。

c语言全面解析指针,十个知识点整理








C语言10个小知识了解指针
1.若有代码,int a=10,*p;p是指针:也是一个变量,且是一个只能用来存放地址的变量。
2.若有代码,int a=10,*p;p=&a;当执行了上面的代码,会说“p指向了a”,其实就是“p指针变量存放了a的地址”。
3.两个*的区别,有如下代码:inta=10,*p;//该处的* 说明p是一个指针变量用来存放地址p=&a;*p=*p+1;//该处的* 表示p所指的变量中的值即a的值10。
总结: 变量定义时的* 说明该变量是一个指针,调用语句中的*表示指针指向的变量中的值。[此处是比较容易混淆的]。
4.int a=10,*p;p=&a;则:*p=*p+1;//等价:*p +=1;(0)++++(*p);表示的内容相同,都是p所指变量的值+1。
5. *p++和(*p)++的区别是: 等价于* (p++),先获取 p当前所指元素的值,然后p指针+1(p指针向后移动一个单元,一般用在数组中,普通变量会越界);后者仅仅是p所指变量的值+1。
6.定义变量时,一个*说明该变量是指针,两个*说明该变量是指向指针的指针(存放的是指针变量的地址)。int a=10,*p,**q;p=&a;//p指向a,*p的结果是10,q=&p;//q 指向p,* q的结果是p的地址值,**G的结果才是10。
7.如果调用函数传递的是地址,那么被调函数中形参就需要使用指针接收,在函数中对指针所指变量值的改变,会影响到调用函数中的变量值。
8.一维数组名和指针的区别,有定义:int a[10],*p;
p=a;//合法,因为,一维数组名存的是数组首地址,这样使 p指向了a首地址,也就是第一个元素的地址。
a++; / /不合法,因为a是一个地址常量,开辟了就不能再修改了,一切给数组名字赋值的操作都是非法的。
p++://合法,因为p是一个指针,p++表示从当前向后移动了一个位置。
对于上面的定义,a[i] 、* (ati)、* (p+i)、p[] 都是合法,都是取下标为i的元素值。所以: p++; 是使指针向后移动,(*p) 十+是当前所指变量的值内容+1。
9.若有定义:int a[3][22],*p[3],iJ;*p[3] 中[优先级[高于*,说明p是一个数组名,前面的*说明该数组中每个元素都用来存放指针,这叫指针数组。如果p和a产生联系,则只能通过逐个赋值的方式完成,即: for(i=0;i<3;i++)p[] =a[; //合法,因为a[] 是二维数组中每行的首地址,所以可以存放到p数组中。
但是 p=a;是非法的,因为a是地址,p是数组的名字,并不是指针名下面获取数组元素的方式都是合法的:*(p[i]+j)*(*(p+i)+j) (*(p+i))[j]。
10.若自定义函数的实参是一维数组名,则该函数的首部可以写成: fun(int al) fun (int a[M]) fun(int*a) M表示长度,若有自定义函数的实参是二维数组名,则该函数的首部可以写成: fun(int (*a)[N])。
fun(int al[N]) fun(int a[M][NJ) M表示行数,N表示列数,若有指针数组作为fun函数的实参,则该函数的首部可以写成:fun(int *a[M]) fun(int *al) fun(int**a)。

C语言指针问题

假如 P 是指针 那么 *p 就代表变量。 而&a是地址, *p=&a 就是把地址给变量,当然不正确了,因为地址只能给指针。
*p2,*p1都是变量,变量之间互相赋值是正确的。
“原因是被赋值的指针变量前不能再加*说明符”这句话的意思是:如果 给 指针P加上“*”,那么它就变成 了变量,代表的意义就变了,而地址只能赋值给指针不能给变量。
最后建议学习看书一定要读国外原著,国内翻译或作者的理解或描述,未必就是正确和合适的。

c语言指针问题解答?

一、P指向a存值的地址,如p指向地址的内存的值为0001,则*p=0001(为1),这时修改*p=0010,则a的值相应的被修改为2。
二、我们只能通过*p修改a的值,p是一个地址指针,更改p后 p指向了另一块内存,a的值不会被更改。
三、
int *p[] p是一个数组,数组内每个元素都是int*类型,也就是指向整型数据的指针类型,
int *p()是int (*p)()函数调用后的返回值指针
int (*p)()是一个函数的函数指针,即指向函数的地址,在调用导出函数时,经常用此方法调用函数
const int *p是指针指向的值无法改变,但是指针本身可以改变,可以重新指向一块内存
int *const p是指针不能改变,但它指向的值是可以改变的
其实还有 const还有其它用法,我们可以来修饰函数,同时修饰地址和值,如:const int * const p,这样想胡乱改就改不掉了

标签:CC++ 编程 C(编程语言) 信息技术 编程语言

大明白知识网 Copyright © 2020-2022 www.wangpan131.com. Some Rights Reserved. 京ICP备11019930号-18