当前位置:首页 » 编程语言 » c语言调不出来设置好的指针
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言调不出来设置好的指针

发布时间: 2022-05-09 19:08:17

c语言有个指针问题。我弄不懂

void swap(int *p1,int *p2)
当你调用这个函数时,如:swap(p2,p3);
实际上相当于 发生了如下初始化 int *p1=p2 , int *p2=p3;
这样 函数里面的p1,p2,的值就是p2,p3,的值了。而指针是间接访问的这个知道吧。
那么在函数里面用p2访问数据,和在主函数里面用p3访问数据,结果是一样的。
因为p2和p3指向同一个地址。
另外说一下变量的作用域问题。解释一下,所谓作用域就是变量有用的区域,也就是说,变量在这个区域内是有用的,在这个区域外是不能用的,也就是没有这个变量
简单点说,就是你在某一个函数里面创建的变量只能在函数里面用,也就是说,如果你在主函数里面定义了 p1 p2,这两个变量就只能用于主函数,在其它函数里面不能用,如果用了的话,编译器就会提醒你没有定义这个变量。
同理,你上面的主函数、排序函数里面都定义了两个同名的指针变量 p1 p2,主函数里的p1 p2和排序函数里的p1 p2分别是两个不同的变量,各自代表着不同的存储空间。所以是不同的变量,只是同名罢了。。。不要再搞混淆了。
顺便和你说一下全局变量这个东东吧。
全局变量就是在函数体之外定义的变量,就是说不属于任意一个函数。它是所有函数都能用的。
是共享数据。不过如果你在某一个函数里面有一个变量和全局变量同名的话,全局变量会被覆盖掉,也就是说如果我有一个全局变量 some ,在我的一个函数int any(void)里面也有一个变量 some ,那么如果我在any 函数里用的some是any函数自己定义的而不是全局变量。
不过,全局变量不要经常用。。。因为共享数据很容易改,重要的是改完还不知道在哪里改的。。。所以容易出错,而且也容易跟同名的局部变量混淆,如上面的some。。。
最后,一时兴起和你说一说所谓的函数调用吧。
当你调用函数的时候,系统会创建一个空间来执行函数操作。也就是说,函数的空间是在你调用的时候才创建的,而当你调用完函数之后,函数空间会被销毁。所以呢,这样会比较消耗时间,每一次都创建、销毁。。。但是用函数的话可以让你的代码看起来美观一点,便于阅读,同时也便于维护。。。所以,其中的利弊要自己权衡了。
另外,因为函数空间用完就销毁了,并且,由于作用域的存在。如果你的函数没有返回值的话,你讲得不到任何数据结果(当然,如果你这个函数仅仅是用来输出的话除外)。并且,如果你用指针的话,也可以。因为指针式通过间接引用来进行操作的,这样你在函数里的操作会直接作用到指针所指向的数据上——指针消除了作用域问题,实现了数据共享,但又不会产生全局变量那样的问题。
不过指针也是很深奥、很危险的。。。它同时也是C语言的精华,也是C语言的缺陷。。。
貌似说太多了,希望能对你有用
危险与美丽共存

❷ 关于C语言指针的使用问题

这么写其实是没问题的。编译不会有问题。
一般直接写
int *addr=(int *)0x2000000;
*(addr++)=0x11;
....
但是以上都是理论,系统对一些地址比较敏感。
你要强制转换的地址是否存在?这个地址是不是已经被别的程序占用了?
你直接这样访问是很危险的,有些编译器会直接报错。
所以一般情况下,PC系统比较多的还是由系统分配地址。

❸ c语言中关于指针调用问题

首先最后是printf("%s\n",a)吧
形参char *p,通过fun(a,5)可知,p此时储存的是数组a的首元素地址

进入fun函数,定义一个数组b[6]存放字符串"abcde",

紧着进入for循环,最开始初始化i为0,接着p=b表示将数组b的首元素地址赋值给p,
此时p被重新赋值了,之前传入的数组a的首元素地址就没有了意义,fun函数的操作(p[i]=b[i]
相当于b[i]=b[i]),不会对main函数造成影响,所以printf("%s\n",a)打印的就是最初的ABCDE

由此也可得知,p被第二次赋值,所以与a已经没关系了,所以它的地址不会变,p只是储存a地址的一个指针变量

❹ C语言指针问题,为什么不能运行呢。

不知道你在程序中的意图,猜测是字符指针传递地址传递到函数并实现在函数体内改变原字符指针的指向,根据这一点,程序只需要改一点:
int fun(char *a,char b,char *pa){
==>
int fun(char *a,char b,char **pa){
因为你在main()中定义的char *p是没有存储空间的,*pa=a+1会导致严重错误,以下代码实现你的设想,在Turbo C 2.0调试通过,希望对你有帮助:

#include <stdio.h>
#include <alloc.h>
int fun(char *a,char b,char **pa){
int i;
for(i=0;a[i];i++){
if(a[i]==b){
*pa=a+i;
return 0;
}
}
*pa=0;
return 0;
}
void main(){
char a[]="abcdefg",b='h';
char *p;
fun(a,b,&p);
printf("%c\n",*p);
}

❺ C语言指针出了点问题

nclude <stdio.h>
d(int numtwo,int mtwo,int *p) ;
main()
{int num,m,n,a;
int *point;
for(num=1;num<=10000;num++)
{for(m=1;m<=num;m++)
d(num,m,point);
}
for(a=1;a<=1000;)
printf("%d\n",point++);
}

d(int numtwo,int mtwo,int *p)
{int a,b,c,d;
a=mtwo/1000;
b=(mtwo%1000)/100;
c=(mtwo%100)/10;
d=mtwo%10;
if(numtwo==mtwo+a+b+c+d)
{*p=numtwo;
p++;
}
}

-----------------------------------
1 d(int numtwo,mtwo,*p)
这样定义是不正确的,要给每个参数都加上类型,改成:
d(int numtwo,int mtwo,int *p)

2 d(int numtwo,int mtwo,int *p)在mian函数前需要声明

3 d(num,m,*point);第三个参数改为point,不需要星号,这里是要地址。

这样后,编译可以通过了。

❻ 关于C语言指针的问题

这个问题不好讲清楚,首先所有函数间传的都是拷贝,并不是本身,就算指针也一样,你传的只是指针的拷贝,而不是原来数据。你先要知道p1、p2分别是指向a、b的地址的指针,p1、p2本身也有地址(不是a、b的地址)。然后p1、p2也是变量,变量的值是a、b的地址,第一种情况:p1、p2的值(a、b的地址)被复制传递到了函数中,函数中p1、p2交换了,但是交换的是拷贝过来的地址,本身值并没有改变,既然地址被交换了,你取里面的值也就交换了。但这些操作只是对地址的拷贝操作,跟主函数没有任何关系,所以主函数并没有被交换。 第二种情况:地址被拷贝过来,然后你用*号,也就是取了地址里面的东西然后交换,就算地址是拷贝的,但照这个地址取东西确实可以的,然后就主函数,子函数都交换了。就像你说北京和人们说的北京都是指首都。如:
【3000】
p = 5000;
【5000】
a
地址3000是p,p的值是5000,5000是一个地址,存放在5000这个地址的值是a。
可能不好理解,等你学的知识多了,就明白了。

❼ 写了个C语言指针练习,一直调不通,有没有大神帮我在VC上调一下保证成功运行,感激不尽。下面贴补充代码

首先这个程序是要实现什么功能?
代码是编译不通过还是结果非预期?

❽ C语言指针问题,本人菜鸟,不懂,请大虾指教!!!!急

首先是编译通不过
就算可以运行,结果是不确定的.
p是在堆栈中分配的内存.当GetMemory函数结束后,这些内存可能会被其它函数使用。
可能会覆盖p,所以结果是不确定的.
堆栈是函数共用的,在一个函数中分配的内存,在函数结束后会释放掉,在进入另一个函数时,分配的内存可能会与上一个函数分配的内存重叠。 这就造成了在这个函数中使用这段内存时,可能会覆盖上个函数的内存,但也不一定会全部会覆盖,这要看情况了。
下面是一个测试程序可以看看:
#include <stdio.h>

char *GetMemory(void)
{
char p[]="hello world";
return p;
}

void Test(void)
{
char *str=NULL;
str=GetMemory();
printf(str);
}

int main(int argc, char* argv[])
{
Test();
return 0;
}

如果会汇编的话,反汇编,可以看一下汇编代码什么都会明白的.

❾ c语言指针问题,额~感觉指针好难,求高手解释

第一个:你设置的字符指针指向的是一个字符串,在设置字符数组的时候例如p【】,这就是一个指针,p是地址,这个声明方式等同于用*p来指向一个字符串。而实际应用中在不知道数组长度时,我们通常使用字符指针来指向一个字符串,节省空间。
所以输出的时候,我们需要的是输出目标的地址,p就是地址,不需要使用*号来代表地址。

第二个不要使用【】就可以了,因为p【】指代指针,或者*p指代指针,没有同时使用两个符号表示指针来指向一个字符串的。

❿ C语言指针 函数不能调用

#include<stdio.h>
#include<string.h>

voidfun(char*a,intk,intn)
{
inti,m=strlen(a);
for(i=k+n;i<m;i++)
a[k++]=a[i];
a[k]='';
for(i=0;i<m-n;i++)
{
printf("%c",a[i]);
}
}
voidmain()
{
intk,n;
chara[80];
printf("pleaseinputk: pleaseinputn: ");
scanf("%d%d",&k,&n);
getchar();//在上一条语句时键盘缓冲区还残留有一个回车符(你输入结束时按的enter),gets()直接读取了这个回车符,
//所以这里要用getchar()将回车符清除。函数fun()是有调用。
printf("pleaseinputstring:");
gets(a);
fun(a,k,n);
}