大家好,今天小编关注到一个比较有意思的话题,就是关于c语言取址的问题,于是小编就整理了3个相关介绍c语言取址的解答,让我们一起看看吧。
c语言中取地址符和*有什么区别?
c语言中取地址符和*有两点区别:
一、p指令: 声明中: * 表示指针,例如: int *p,p是指针,指向整型量。*p表示指针指向的整型量的值。 语句中,p表示指针指向的地址。如果p是指针,没有 &p 形式。
二、 x指令: 声明中:x是整型量。&x是整型量x的地址,不是指针。 语句中:x是整型量x的值。&另一用途是按位运算符,按位* 是乘号。
C语言中怎样让程序转到指定的内存地址去执行?
为什么要用指定的内存地址执行程序。当然,c语言被编译连接后肯定都是一条一条的指令。也肯定是存在内存中的。那么如果你是想跳到其他的程序的指令。那么你的需求是有用的。可是,很不幸。这样的话,操作系统是不允许的,会报异常的。属于内存越界错误,很明显你创建的程序是无法访问其他程序的指令的。
其次,如果你只是想跳到本身的c语言的某条指令的话。使用goto语句就可以实现。虽然是不鼓励的。
其次,规范好你的算法实现。用循环和判断完全能够实现。如果那条指令是汇编编写的程序的话。你也可以在c中嵌套汇编语言,jump到该指令。
如果是汇编有关的话,跳转指令应该经常会用的吧。
C语言的指针不是地址吗?为什么地址还要区分类型?指针的加法也好难,该怎么理解呢?
c的指针确切说是俩寄存器,里面存放地址。
区分数据类型是为了更好保护内存不被随意改写,编译器能检查出来,实际是不区分类型的。
学指针可以看看汇编语言,加强对指针的理解。其次用画图方式,把内存画出来,再去思考指针的指向动作。对指针加法操作时,就是给寄存器赋上基础地址并根据数据类型位数算出偏移地址写入寄存器,然后cpu执行。
你新,新,新,新来的吧?你不告诉指针它指向的内存存储的数据类型,它给你返回几个字节?指针指向的都是数据的首地址,一个指向内存中某个字节的地址而已,但它要返回后面多少字节的数据,需要你告诉它。感觉我讲得比较粗俗,水平低,没法讲得更文雅(=^▽^=)
谢谢邀请。
题主的疑问应该是,C语言的指针变量里存放的是地址,而地址明明是一个整数,为什么整数还要区分类型?至于指针的加法,题主应该是注意到了有时候 1+1 并不等于 2,对不?其实这并没有什么难的,请继续往下看。
稍稍思考一下,应该能够发现,C语言中的指针是通过修改内存来修改变量的值的。
既然指针是通过修改内存来修改变量的值的,那么,一个指针一次修改多少内存呢?这就涉及到指针的类型了。请看例子,相关C语言代码如下:
对于数组 i[8],i 其实就表示这个数组的首地址,所以可以直接把它赋值给指针变量 p1。这样一来,我们就可以通过 p1 来修改数组 i 了。
指针 p1 是 signed char* 类型的,通过 p1 修改 i 所在内存时,一次修改 sizeof(signed char) 字节,也即 1 字节。那么,p1+1 指向的就是 i 的第二个元素(i[1]),执行 * (p1+1) = 5; 以后,i[1] 就等于 5 了。
按照这个逻辑,p2 是 int* 类型的指针变量,请看上图,通过 p2 访问数组 i 时,一次访问的实际上是 sizeof(int) = 4 字节内存。所以 * (p2+1) = 9; 实际上修改的是 i 的第 5~8 字节。
类型说明了指针指向内容的数据长度。为了你不把内容操作错误,C语言编译器在检查类型。
当然,如果你能确保逻辑和内容长度的正确性,在C语言层面你也可以强行转换成另外的指针类型。
在汇编语言中,内容是没有类型的,只有内容长度。连内容整数符号都不明确说明,整数的符号体现是在操作数据的不同机器指令来体现的。
C语言指针类型的差别只是为了在语法层不让你轻易犯错。
到此,以上就是小编对于c语言取址的问题就介绍到这了,希望介绍关于c语言取址的3点解答对大家有用。