c语言-C语言指针移动后指向问题

问题描述

C语言指针移动后指向问题

void change _ prt();
main()
{
int * prt,b[3] = {1,2,3};
prt = b;
change _ prt(prt);
printf("%dn", * prt);
}
void change _ prt(p)
int * p;
{ p+=2;
}
为什么结果是1,而不是3?
谢谢。

解决方案

你这代码一堆错误,能编译通过?

 void change_prt(int ** p);
int main()
{
    int *prt,b[3] = {1,2,3};
    prt = b;
    change_prt(&prt);
    printf("%dn", * prt);

    return 0;
}

void change_prt(int **p)
{
    p+=2;
}

至于结果为什么不是3
指针可以通过修改它指向的内容
但是你这里是修改指针本身的值(如32位机子下,指针是32位的地址,你只是修改了地址值而不是该指针指向的内存)
在这里来说指针值只是个值传递,会拷贝临时变量的,所以对参数p来说,p的值没有改变
但是
void change _ prt(int * p)
int * p;
{
*p = 10; // p的值也是没有改变的,只是改变了它指向的内存,以前的内存值1,现在是10
}

我修改后的代码,就是把该b头元素地址也昨晚一个指针。

就比如,你有一个文件F,在其他地方生成一个快捷方式S1,你用S1打开文件修改内容并保存,
在原始文件列表再打开F,看到的是修改后的内容

现在的参数就相当于这个快捷方式S1传进去,生成一个临时变量S2,你在其中修改S2指向的路径,那跟S1完全没有关系
(S1快捷方式还是指向你的文件F)

不知道是否明白。

修改后的代码,就是再F,S1,在加一个快捷方式SS1指向S1...

解决方案二:

全局变量和局部变量同名。在局部变量的作用域内,全局变量不起作用

解决方案三:

不要用同名,你改变的不是参数p

解决方案四:

p[0]+=2; 出来的就是3了

解决方案五:

建议楼主 去看下 参数传递方式 值传递和地址传递的真正意思 在看下二级指针 这个问题就明白

时间: 2024-10-30 22:08:29

c语言-C语言指针移动后指向问题的相关文章

c语言-C语言指针指向数组问题

问题描述 C语言指针指向数组问题 #include int main(){ int a[5]; int *p,i; printf("please enter ten numbers:"); for(i=0;i<5;i++){ scanf("%d",&a[i]); } for(p=a;p<(a+5);p++) scanf("%d",*p); printf(" "); return 0; } 代码如图,是课本上

c语言-循坏链表队列中尾指针与头指针的分别指向哪里

问题描述 循坏链表队列中尾指针与头指针的分别指向哪里 我看人民邮电出版社的数据结构(c语言版)第2版,课本例题里链队的头指针front是指向队头元素,尾指针是指向队尾元素的下一位,但在后面的习题里的循坏链表队列的头指针front是指向队头元素的下一位,而尾指针是指向队尾元素,这是自己想指向哪里就指向哪里吗?有没有什么规定的?例题里是普通链队,习题里是循坏链表队列,跟这个有关吗? 解决方案 其实没有什么规定,只要是循环的,链表都算是循环链表.如果你多找基本书来看,就发现了. 解决方案二: 这也是我

c语言-C 语言基础问题 指针素组 为什么指针p所指向地址会被改变?

问题描述 C 语言基础问题 指针素组 为什么指针p所指向地址会被改变? #include char *p[] = {"to","yes","is ok","how do you do ?","holle"}; int main(int argc,char* argv[]) { int a[5] = {0}; int i = 0; int j = 0; char ** t; t = p; for(i = 0;

深入解析C++中的指针数组与指向指针的指针_C 语言

指针数组定义:如果一个 数组,其元素均为指针型数据,该数组为指针数组,也就是说,指针数组中的每一个元素相当于一个指针变量,它的值都是地址. 形式:一维指针数组的定义形式为:int[类型名] *p[数组名] [4][数组长度];由于[ ]比*优先级高,因此p先与[4]结合,形成p[4]的数组的形式.然后与p前面的" * "结合," * "表示此数组是指针类型的,每个数组元素都相当于一个指针变量,都可以指向整形变量. 注意:不能写成int (*p)[4]的形式,这是指的

C语言 指针数组 和 指向指针的指针

指针数组 指针数组是一种特殊的数组,这类数组存放的全部是同一数据类型的内存地址.指针数组的定义形式为:     数据类型 *数组名[长度]; 例如: const char *c[4] = { "China", "USA", "Rassia", "Japan" }; // 定义长度为 4 的常量字符型指针数组,将数组元素分别指向 4 个 字符串常量 int i;for (i = 0; i < 4; i++){    put

c语言-关于C语言结构体指针类型的强制转换(求大神详细解答)

问题描述 关于C语言结构体指针类型的强制转换(求大神详细解答) #include <iostream> #include <algorithm> using namespace std; typedef struct { string dna; int count; }DNA; DNA dna[101]; **int cmp(const void *a,const void *b) { DNA *aa = (DNA *)a; DNA *bb = (DNA *)b; return a

关于c语言结构体指针数组的问题

问题描述 关于c语言结构体指针数组的问题 我有一个数组,里面每个成员都是结构体指针,我应该怎么给这个数组分配空间? 解决方案 指针变量的长度都是固定的,与你指向什么东西没关系的. 解决方案二: #include #define N 3 struct student { long int num; char name[20]; float score[3]; float aver; }; int main() { void Input(struct student stu[]); struct s

struct-c语言中为什么这样赋值后,两个却一样

问题描述 c语言中为什么这样赋值后,两个却一样 #include #include typedef struct HH { int i; int j; struct HH *next; }HH; void changeV(HH *p) { HH tt; tt.i=6; tt.j=2; tt.next=&p[0]; p[0]=tt; //tmp->i=1; //tmp->j=2; //tmp->next=NULL; //p[0]=tmp; } int main() { HH h[5

深入解析C语言中函数指针的定义与使用_C 语言

1.函数指针的定义    函数是由执行语句组成的指令序列或者代码,这些代码的有序集合根据其大小被分配到一定的内存空间中,这一片内存空间的起始地址就成为函数的地址,不同的函数有不同的函数地址,编译器通过函数名来索引函数的入口地址,为了方便操作类型属性相同的函数,c/c++引入了函数指针,函数指针就是指向代码入口地址的指针,是指向函数的指针变量. 因而"函数指针"本身首先应该是指针变量,只不过该指针变量指向函数.这正如用指针变量可指向整形变量.字符型.数组一样,这里是指向函数.C在编译时,