A. c语言 指针
是啊 前面赋值了 但是
for(i=0;i<10;i++)
*p++=i;
运算以后. p 就等于 &a[10] 了啊 p++ 这条对p指针进行了加操作
那个交换是交换的内容数值
/////假定 p1 指向的数位 50 , p2 指向的内容为 30
{
int temp; //定义变量,用来缓存中间数据
temp=*p1; //将p1指向的 内容数值缓存到 temp 中 *p1=50,temp=50,*p2=30
*p1=*p2; //p2指向的数值赋值给p1指针 *p1=30,temp=50,*p2=30
*p2=temp; //temp缓存的中间数据赋值给p2指针 *p1=30,temp=50,*p2=50
}
之所以没有引入指针型变量 *temp 是因为没有这个必要 ,因为指针运算是16位的,增加程序运算量不说, 你引入了 *temp 还是要给*temp赋值的,还是要引入一个普通变量,因为指针不赋值是没法操作的
B. C语言指针解释一下啊
%p 和 %d 显示的是同样的内容 只不过是两种不同的形式
%d是十进制的形式
%p 指针形式 表现为十六进制
C语言中每个变量都有内存地址
而 & 操作符就是用来获取变量的内存地址的。例如变量a的地址是123,那么&a的值便是123,而a的值可以是任意的。
指针是用来保存变量的地址的,指针本身的值就是另外一个变量的地址。
所以在你的图中,p的值是a的地址&a,而&p是指针自己的地址。
而*操作符,是用来获取指针保存的地址的变量保存的值。
所以*p可以得到p保存的a的地址所在的变量a的值。
*p -> *(&a) -> a
C. c语言中指针访问内存问题
在定义一个指针时如果还不确定让它指向何处,就先给指针赋一个空值
例如int
*p=NULL;
这样不会使你定义的指针称为野指针,而且你在检查的时候会一眼就看到这个指针的初始状态,可以很容易知道现在该如何对其操作
D. c语言指针详解
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量。
计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 4 个字节,char 占用 1 个字节。
为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。
C语言用变量来存储数据,用函数来定义一段可以重复使用的代码,它们最终都要放到内存中才能供 CPU 使用。数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存到底存储的是数据还是代码。
当程序被加载到内存后,操作系统会给不同的内存块指定不同的权限,拥有读取和执行权限的内存块就是代码,而拥有读取和写入权限(也可能只有读取权限)的内存块就是数据。
CPU 只能通过地址来取得内存中的代码和数据,程序在执行过程中会告知 CPU 要执行的代码以及要读写的数据的地址。
如果程序不小心出错,或者开发者有意为之,在 CPU 要写入数据时给它一个代码区域的地址,就会发生内存访问错误。这种内存访问错误会被硬件和操作系统拦截,强制程序崩溃,程序员没有挽救的机会。
变量名和函数名为我们提供了方便,让我们在编写代码的过程中可以使用易于阅读和理解的英文字符串,不用直接面对二进制地址,那场景简直让人崩溃。
需要注意的是,虽然变量名、函数名、字符串名和数组名在本质上是一样的,它们都是地址的助记符,但在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址。
(4)c语言指针缓存扩展阅读
指针使用(* 和 &)
*&a可以理解为*(&a),&a表示取变量 a 的地址(等价于 pa),*(&a)表示取这个地址上的数据(等价于 *pa),绕来绕去,又回到了原点,*&a仍然等价于 a。
&*pa可以理解为&(*pa),*pa表示取得 pa 指向的数据(等价于 a),&(*pa)表示数据的地址(等价于 &a),所以&*pa等价于 pa。
对星号*的总结
在我们目前所学到的语法中,星号*主要有三种用途:
1、表示乘法,例如int a = 3, b = 5, c; c = a * b;,这是最容易理解的。
2、表示定义一个指针变量,以和普通变量区分开,例如int a = 100; int *p = &a;。
3、表示获取指针指向的数据,是一种间接操作,例如int a, b, *p = &a; *p = 100; b = *p;。
E. 关于C语言指针!
c语言中的指针占内存就是4个字节
p是指向char的指针,char占一个字节,所以p++在内存地址上增加一个字节
而p1是指向指针的指针,一个指针变量占4个字节,所以p1++对应的内存地址增加了4个字节
F. C语言如何释放指针
为了避免释放已经释放了内存的指针内存,或没有释放内存,在c语言中最好是在定义指针时赋初值NULL,释放后立即赋NULL,释放时检查指针值再决定释放就避免释放错误了,如:
int *a = NULL
int *b = (int*) malloc(sizeof(int) * 10);
int *c = NULL, *d = NULL;
c = b;
d = a;
/* 执行大量操作后 */
if(a != NULL) free(a);
if(b != NULL) free(b);
if(c != NULL) free(c);
if(d != NULL) free(d);
按照这样规定,即使代码再长,以及经过多次设计指针的函数调用,依然不会造成内存泄漏,或内存释放错误!
G. c语言指针
i_pointer-----指针变量,它的内容是地址量:是定义一个存放地址的变量,即指针变量,其存放的是一个地址。
*i_pointer----指针的目标变量,它的内容是数据,就是指针变量的值(地址)所对应的存储单元中存放的数据。
&i_pointer---指针变量占用内存的地址,是指针变量i_pointer的地址,也就是存放地址的“指针变量i_pointer的地址“。
H. c语言指针保存地址问题
指针地址不管几级 说穿了也不过就是一个和系统位数一样的整数,你甚至是可以用一个int把他存起来
存起来是随便你怎么玩的 但是你要访问最终的内容的时候,你就得需要知道他是几级的
I. C语言指针
请参考以下程序,已编译运行过,可以得到正确结果:
#include<stdio.h>
int main(){
int a,b,*pmax;
int *max(int*,int* );
printf("Enter a b:");
scanf("%d %d",&a,&b);
pmax=max(&a,&b);
printf("max=%d\n",*pmax);
scanf("%d",&a);
return 0;
}
int *max(int *a,int *b)
{
int *p;
p=*a>*b?a:b;
return(p);
}
J. c语言,关于指针
没区别,如果两个指针中间只有一个*就是两个指针(指针是地址是整数)相乘;指针内容*p是有类型的,编译器会对指针内容进行检查,如果类型匹配乘法运算(或*重载运算),就可以通过编译和运算。kp和pm是指针*kp 和 *pm是指针内容(k和m),*kp * *pm实质就是两个指针内容进行相乘(k*m)。