当前位置:首页 » 编程语言 » c语言所有指针都是可以互相转换
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言所有指针都是可以互相转换

发布时间: 2022-05-17 14:30:02

c语言中指针和数组是怎样相互转换的

指针数组,就是一个数组里存放的都是指针,比如*p[8];p[0]里存放的就是一个指针数据
数组指针,数组名就是一个指向数组起始地址的指针,数组下标是萦引,比如num[0],他就相当于num+0;
num这个指针没移动,于是取的是数组的第一个。num[1]相当于数组指针移1,于是指向数组第二个

㈡ C语言指针变量名和数组名在计算中是不是可以直接相互转换啊

C++/C程序中,指针和数组在不少地方可以相互替换着用,让人产生一种错觉,以为两者是等价的。

数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。

㈢ c语言指针转换

没有实用意义,只能用于练脑子,或考考雕虫小技,或像鲁迅笔下的孔乙己,卖弄一下“茴香豆的回字有多少种写法”,以彰显学问有多深。
*p 的“星号”是 “求值运算”,如果p是指针,*p 则是 指针 p 指向的值。
如果 p 不是指针, 那么 这个 *p 就不知道是什么东东,可能是乘法,也可能是错的,那就闲着没事练脑了。
(int *) 是“强制转换”,有星号,则是“指针地址类型转换”,例如 char *p="1"; (int *) p 就 把 p 的首地址变成 int 型 指针指向的地址,原来 p+1 是 p 的地址加1 ,现在 成了 p+sizeof(int)。 *(int *) p 就是首地址指向处4个字节长度内存里的数值了。
*(int *)*p 不知道有何意义,要把程序写全,才好猜,很费脑子的。简单思维,可以说是一个错误表达式。

㈣ c# ref与c语言的指针能互传吗

严格来说不可以!
这里边有几个错误的理解需要纠正一下:
来格来说int是属于.net的,int是Int32的别名,也就是32bits的数字,当然,short是Int16的别名,long是Int64的别名,如果说C#语言的话,可以说Int32,一般情况下我们再不区分int与Int32的区别。而C语言中的int却并不是32bits数,而是16bit数!换句话来说,如果是平台调用(PInovke)的话,一般我们用C#中的short来接C语言中的int!
当然,如果指针类似值的话,一定要了解平台调用部分的数据封送!数据封送部分介绍了平台之间数据如果对接的,这部分的知识一定要理解。但是有时只有一个参数时,大多数我们会使用C#语言中自动转换的方式,比如使用C#中int去接C语言中int中的值是没有问题的(C#会把short自动转换为int).
但是,对于结构(struct)之类的,由于其中包含多个值,所以对于对象进行平台封送时,一定要使用相应的形式(其实是内存数据的重新包装而已),如果要使用特定的数据形式,一定要使用特性化编程中的位节说明来说明字体的长度(比如在接值的时候string接值时就必段说明内存段大小)。
第二个问题是关于ref或out的,ref只是传址引用,并不是指针(一定一定不要用指针这个词,因为在.net中除值类型valuetype和引用值类型object之外,在非安全编程unsafe下是存在指针的!)其实呢,无论是引用类型或是值类型的参数,传入的都是一个值(值类型)或副本(浅表复制),而ref/out是传址引用,在托管代码下,ref/out表示的传址引用,与指针还是有区别的!你可以认为他是一种隐藏的指针方式(*与&是配对的,这才是指针,传入的是一个真实的逻辑地址),而ref/out并不是把指针进行了打包,而是将址进行了堆栈查找。换句话来说,指针传入的是一个逻辑地址,而ref则告诉调用查询你自己去这个变量的地址去改变——再说传统一点(就是教学书上标准的说法)就是传入的是对象并不是副本了(我们说正常的参数是一个对象的副本)!
第三个问题,也是关于ref/out的,一定要记着,如果第二个问题你理解了,第三个问题其实是不是犯错的!关于参数签名中含有ref/out的话,那么调用时一定要使用ref来表现参数!比如set(ref int x)在调用时一定要使用set(ref x);而不能是set(x),否则只是传入副本(值)所以,int x = 0; set(x);方法是错误的,应该是set(ref x);否则会出现无法配置签名(找不到方法)的例外。
至于最后一个,那么就是指针互传这个称呼是多么错误的!关于非安全编程,是否存在指针互传的问题也不是正确的。所以关于指针来说,两种语言的指针都是各自所指,并没有脱离语言本身的存在,所以这两个指针互传在语言层面之外,并不存在这样的称呼。
所以这里你如果将set(x)改为set(ref x)应该可以执行——如果不能执行,有执行错误(注意平台调用发生错误时,由于非托管的错误你只能拿到托管错误,并不能拿到真实的错误原因),将int改为short,然后就可以了!

㈤ 关于c语言的指针相互指向

指针变量也是变量,同样存储在内存中,它也有一个地址,取变量a的地址存在指针变量p中,所以&a和p的值肯定是相等的
取指针变量p的地址赋值给q,即q此时存储着指针变量p的地址,而*q则是 指向 q中存放的地址 (指针变量p的地址),所以*q的值即是指针变量p中存放的地址,即是变量a的地址。
所以三个值相等。

㈥ c语言指针强制类型转换

一个指针做算数加减的时候,字面上的加一或者减一,实际增加或者减少的值是其指向类型的空间大小
也就是说,p+1,实际增长的值是sizeof(*p)
所以,将p转为int*后,加10,实际增加是10*sizeof(int)也就是40
而如果是p+2,由于p是char*,实际增加的是2*sizeof(char)=2

㈦ C语言中,指针的类型转换

可以。

p = (int *)&a;

但是要注意的是,如果此时a==1.0f,*p就不一定是1。

因为这就相当于:

union{
inti;
floatf;
}u;
int*p=&u.i;

㈧ C语言的指针互换

是int类型,没有错啊,但是 它没有空间啊? int t 系统会自动分配存储一个int类型的空间,
而int *t t是一个指针?它指向哪里了?将 *a 赋值给 *t ,这个t用什么来存储这个值?

㈨ C语言中指针的转化

1的testpu是一个指针,并没有给它分配内存,它指向的是系统的只读的内存
2的testpu是一个数组,占内存空间3个字节,是可读写的

最后的tepu1是这样的,testpu本身是一个字符数组,可以理解成char*,先将char*强制转换成int*,然后再取这个指针指向的内存值,因此得到testpu这个地址上4个字节组成的int的值

㈩ c语言指针交换

这个是这样的,因为指针变量一般就是32位的长度,同样int类型也是32位的长度,p1里面的地址也是能放在p里面存储的(char ,short类型就不行了)。但是对于编译器来说,存放在p里面,他就认为是一个整数,所以就不能做一些指针的操作了,比如*p。但是如果只是向你这种只是简单交换一下值是没问题的。