c语言指针问题解答?
这不是与p+3-p=12矛盾,而是,这个等式本来就不成立好不。学指针的时候会有点糊涂,这个很正常。
你把两个东西混淆了:数组的下标和实际的地址。
float类型的指针,在地址上来说的确是按4字节为单位移动的,但是在数组里面还是一格一格一栋栋饿啊,这个一格的单位是4字节。
p+3-p,你等式左边的算法是在数组里的单位,既一格一格移动;
=12,你右边的是按照地址的实际大小得出的。
两边表示的不是一种单位啊。。。
还有就是这种理论上的东西你越想越糊涂,实际去写一个测试程序,把指针指向的地址打出来看看 不久知道了?
char* ss = "0123456789";
要求这种字符串的长度是不能用sizeof的,如果用sizeof它计算出来的会是这个指针的长度,在32系统下,指针一般都是4个字节,所以,结果是4。计算字符串的长度,可以使用库函数strlen来计算,它计算出来的长度不包含字符串结束符\0。有了这个思路,其实你可以自己写一个函数来计算字符串的长度。使用strlen时要包含string.h头文件。
二、我们只能通过*p修改a的值,p是一个地址指针,更改p后 p指向了另一块内存,a的值不会被更改。
三、
int *p[] p是一个数组,数组内每个元素都是int*类型,也就是指向整型数据的指针类型,
int *p()是int (*p)()函数调用后的返回值指针
int (*p)()是一个函数的函数指针,即指向函数的地址,在调用导出函数时,经常用此方法调用函数
const int *p是指针指向的值无法改变,但是指针本身可以改变,可以重新指向一块内存
int *const p是指针不能改变,但它指向的值是可以改变的
其实还有 const还有其它用法,我们可以来修饰函数,同时修饰地址和值,如:const int * const p,这样想胡乱改就改不掉了
1.
能通过指针p改变a里面的值,前提是a不是常量且指针p不是指向常量的指针(只读型指针)。举例:
a、
int a=1,*p=&a;
//此时a等于100了
*p=100;
b、
int a=1;
const int *p=&a;
//不能通过p改变a的值,因为p是只读型指针(只读型指针可以指向变量,但不能通过指针修改它指向的变量的值,就好像在它看来,它好像指向的是一个常量)
//*p=100;
c、
const int a=1,*p=&a;
//同样不能,因为a是常量且p是只读型指针
//*p=100;
2.
int (*p)[n]是指向数组的指针(数组指针),p指向的数组需有n个int型元素,如:
int a[2],b[2][2],(*p)[2];
则p=&a;p=b;p=b+1;都行。
int *p();是函数声明。函数名是p,不需要参数,需返回一个int类型的指针。
int (*p)();是指向函数的指针(函数指针),p可以指向的函数需满足无参且返回类型为int,如:
int f()
{
}
int (*p)()=f;可以。
const int *p;是将p定义为指向常量的指针(只读型指针),这样就不能通过指针p改变它指向的变量的值,就好像它指向的是一个常量,前面已有这样的例子了。
int * const p是将指针p自己定义为常量,即它永远指向同一个变量或常量,不能改变p自己的值(即除了初始化时,不能用=为它赋值),因此必须在定义时初始化p,如:
int a=1,c;
const int b=2,d=3;
则int * const p=&a;int * const p=&b;都行,而p=&c;p=&d;都不行。
C语言指针问题
假如 P 是指针 那么 *p 就代表变量。 而&a是地址, *p=&a 就是把地址给变量,当然不正确了,因为地址只能给指针。p2,*p1都是变量,变量之间互相赋值是正确的。“原因是被赋值的指针变量前不能再加*说明符”这句话的意思是:如果 给 指针P加上“*”,那么它就变成 了变量,代表的意义...
C语言指针问题(初学者)
1.概念问题:指针是指存放地址值的变量或常量;指针与一般变量或常量的区别,在于它不直接存储数值,而是存放被存储数值的地址,属于间接存放,所以不少初学者感觉学习困难。比如:int a=2,b,c,*ptr; ptr=&a;表示将指针ptr指向变量a,存放a的地址,假设是2000H,而指针变量ptr本身也要有地址,假...
关于c语言指针的一些问题
首先 你要告诉我 a 的类型 如果 a 是非指针型变量 那么 *p=a 是正确的 他表示 指针p 指向的单元 内容为 a (当然 如果a是数组名的 因为数组名也是指针型的 所以 就是错误的) 2,如果a 数组名 那么就是正确的 他表示 指针p 指向的单元 内容为 a [0] 3、a 是数组名的...
C语言指针问题?
调用结束后,所有实际参数的值均不会发生变化。但是swap3中*pa,*pb发生的交换(实际就是主函数中a和b的值发生了交换)
c语言指针问题,求解答
首先 函数指针的定义 A、D定义为:A 定义指向函数的指针pf,所指向的函数参数为空,无返回值 D 定义指向函数的指针pf,函数参数为int,char型(不符题意,题目为int,char*),无返回值 B、D的定义为:定义函数pf,函数参数为空,返回类型为void *(void 型指针)单从函数指针的定义可排除BCD。其次...
关于C语言指针的问题
第一种是定义字符数组指针,指向字符数组中的元素,也就是字符串,第二种是指向字符指针的指针,里面应该存放地址,而不是字符串。
c语言指针问题求详细过程
贴上代码,图片中讲解了程序运行过程,希望能帮助你加深对指针的理解。#include <stdio.h>f(int *a, int *b, int *c) {int *t;t=a;a=b;b=t;*t=*b;*b=*c;*c=*t;}main() {int a=5,b=7,c=3;int *p1=&a,*p2=&b,*p3=&c;f(p1,p2,p3);printf("%d,%d,%d",a,b,...
c语言程序指针问题
.因此,使用空指针时要特别小心。二、指针变量赋值问题1、指针赋值带来的内存丢失在C语言中指针之间是可以相互赋值的,但是使用不当可能会造成部分内存的“丢失” ,即这部分内存空间不能再被该任何程序访问。如: main(){float...
c语言问题,关于指针的问题
显然p是一个指针变量。while()循环括号里的返回值,为0或NULL时,while循环直接结束。一、比如我们定义一个int型指针变量。int *p=NULL;初值为空。那么当执行while(p);时,只有p==NULL时,while循环才会结束。所以如果我们写while(p);printf。。。;那么只有当p为空时,后面的printf才会执行...
一道C语言指针类问题(有答案,解释一下过程)
从 i=0;i<2;i++ j+=2 这两句,可以得知,分析的字符是p[0][0]、p[0][2]、p[1][0]、p[1][2],即 '3'、'9'、'2'、‘8’if((p[i][j]-'0')%2) 是判断上述字符转换为数字后,哪个是奇数(模2不等于0),可以得知是 '3'、'9'num初始值是0,第一次分析出3后 num ...
宰父沾咽炎:[答案] *p++;编译器将先执行++,也就是将地址加1,在执行*来取值,这样取到的是一个无意义的值,(*p)++;用括号提醒编译器先执行*取值,取到值以后,在对这个值加1 总的来说就是不加括号,++运算符作用到指针上,加了之后作用到指针所指的...
凉城县18653027589: C语言中关于指针问题 - ?
宰父沾咽炎: 我刚刚在VS2010里试了一下, B和C都是错的.计算机题目应该都是单选的, 所以有可能是你有一点的笔误, B如果是(*w+1)[4]就正确了.首先我给你一个最简单的我自己总结的方法吧, 要想从数组或者指针中取数据的话, 要满足这个公式(...
凉城县18653027589: 帮忙解答下C语言基础指针问题 - ?
宰父沾咽炎: int *p=&c 相当于 int *p; p=&c; 这还真不好说 指针是c的精华也是难点 定义的时候 要做申明 *p表示这是个关于p的指针当然对应的就是地址&c 但是定义之后 用的时候 *p就表示p这个指针的首地址上的数据 说的我都有点绞了 多看看例子
凉城县18653027589: C语言指针求解 - ?
宰父沾咽炎: #include void swap(int *p1,int *p2); int main () { int a,b,c,*p1,*p2,*p3; printf("please enter three number:"); scanf("%d%d%d",&a,&b,&c); p1=&a;p2=&b;p3=&c; swap(p1,p2); swap(p2,p3); swap(p1,p2); //here printf("%d %d %d",*p1,*p2,*p3); ...
凉城县18653027589: C语言的指针问题 - ?
宰父沾咽炎: 指针,说白了就是储存数据内存段的地址.打个比方说,你家的门牌号是306,那么你家中回来一些客人,这些客人就相当是一些变量,而门牌号就说明了地址,如果张三在你家,另一个人要找到他,那么此时我们只需要告诉那人306,就相当...
凉城县18653027589: c语言指针问题 - ?
宰父沾咽炎: 第一句话就说错了,应该是“int *p;表示p是int *类型指针变量,p中存放int类型变量的地址”而不是“int *类型变量的地址”.所以后面你就解释不了了,实际上是“p=&i;是p中保存了i的地址,*p自然是p中保存的地址中的变量i的值”.那么i是多少*p就应该是多少.
凉城县18653027589: c程序 ,指针问题求解(详解) - ?
宰父沾咽炎: 解释在程序中,你看看. #include<stdio.h> void main() { int a[]={1,2,3,4,5}; int *ptr=(int *)(&a+1); //在数组a的初始地址的基础上,再加整个数组a的空间(每个分量2字节,共10字节) printf("%d %d",*(a+1),*(ptr-1)); //*(a+1),数组a的初始地址,偏移量为1(2字节),也就是第二个分量;ptr为int型,向前偏移1单位(2字节),所以应当是a的第五个分量的地址 }
凉城县18653027589: c语言指针的问题,希望详解 - ?
宰父沾咽炎: 一下内容纯属个人理解,存在误差也是难免,仅供参考理解指针前需要理解几个相关的问题:1.对于非特定的内存分配是有系统进行动态分配的,既然动态了,那么分配的地址就会存在差异,这个系统内存分配算法相关,运气好点的,几次都会...
凉城县18653027589: 有关指针的C语言试题求解 - ?
宰父沾咽炎: 您好楼主,ishead的回答是正确的,我稍微多啰嗦一下.int a[5][6]是一个二维数组,a[0]的意思是数组的第一行元素, 比如 a[5][6]= { {0,1,2,3,4,5}, {0,1,2,3,4,5}, {0,1,2,3,4,5}, {0,1,2,3,4,5}, {0,1,2,3,4,5} }; 于是有 a[0]= {0,1,2,3,4,5}; 而(*p1)[6] ...
凉城县18653027589: C语言指针习题解答?
宰父沾咽炎: int a,b[5]; // 声明 a=0; b[0]=3; // 初始化 func(&a,b); // 相当于b[0]=a+6; 即b[0]=0+6; printf("%d\n", b[0]); // func为传址调用,b[0]为6 答案为6,原因见上面的注释.二楼正解. 如果是考题,就不用多想了. 如果是自己写的,第一,b[5]未完全初始化,应该避免.第二,func中应当对指针参数的合法性进行判断,避免非法调用.