C语言 指针问题
指针在用要注意初始化,例如:
int *p;
p为指针,地址是未知的,如果直接赋值
*p=a;这样编译可以通过,但是会产生警告,p的地址是随机分配的,这样对未知的地址赋值很危险,可能会覆盖掉某些重要数据,所以避免这种危险,在定义指针时注意初始化,也就是赋值。
可以int *p=&a;
或者int *p;
p=&a;
然后再对p进行操作
有错。
注意大小写,还有
int a=9;
int *p;
p=&a;//这个是指针指向a
*p=8;
这样就对了。
扩展资料:指针的赋值
int *p;
int a;
int b[1];
p = &a;
p = b;
指针的赋值,“=”的左操作数能够是*p,也能够是p。
当“=”的左操作数是*p时,改变的是p所指向的地址存放的数据;
当“=”的左操作数是p时,改变的是p所指向的地址。
数组的变量名b表示该数组的首地址,因此p=b;也是正确的
同类型的指针赋值:
int val1 = 18,val2 = 19;
int *p1,*p2;
p1 = &val1;
p2 = &val2;
p1 = p2; //注意啦,p1指向了val2,而没有指向val1
备注:字符串与指针的初始化和赋值
初始化:
char *cp = "abcdefg"; //这个初始化过程,是将指针cp指向字符串的首地址,而并非传递字符串的值。由于,在C语言里面,没有总体处理一个字符串的机制
赋值:
cp = "abcdefg";
*cp=”abcdefg” ;//错误!字符串常量传递的是它的首地址,不能够通过*cp改动该字符串的值,由于该字符串为常量,而它仅仅是简单的将指针指向该字符串常量。
30分钟彻底学会C语言指针
使用的指针函数
考虑到题中说的是小朋友学习100以内正整数的简单运算
所以考虑到了被减数 大于 减速 ,除数不为0,整除的情况
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<conio.h>
char expression[10];
char *p=expression;
int result;
char * GetRandomExpression();
int main()
{
char *p1;
int i,count=1;
char ch;
printf("请输入下列算式的结果:
");
while(1)
{
p1=GetRandomExpression();
printf("第%d题:%s",count,p1);
scanf("%d",&i);
if(i==result)
printf("恭喜!您答对了
");
else
printf("抱歉!您答错了
");
printf("是否继续?(按Y继续,其他任意键结束):");
ch=getch();
if(ch=='Y'||ch=='y')
{
printf("您选择了继续
");
count++;
}
else
{
printf("您选择了退出
");
break;
}
}
}
char * GetRandomExpression()
{
int num1,num2,index;
char op[]="-+*/";
srand(time(NULL));
num1=rand()%100+1;
num2=rand()%100+1;
if(num1<num2)
index=rand()%3+1; //保证被减数大于减速
else
index=rand()%4;
switch(index)
{
case 0:
result=num1-num2;
break;
case 1:
result=num1+num2;
break;
case 2:
result=num1*num2;
break;
case 3:
while(num2==0||num1>100||num1%num2!=0) //保证除数不为0,且可以整除
{
result=rand()%100+1;
num2=rand()%100+1;
num1=num2*result;
}
break;
}
sprintf(expression,"%d%c%d=",num1,op[index],num2);
return p;
}
#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "time.h"
char* GetRandomExpression( ) {//用于获取一个满足条件的算术表达式(用字符串表示)
int data1, data2, oper, data[4], i = -1, j = 0;//data是用于存放数位数字的数组
char str[10];
srand(time(0));
oper = rand( ) % 4;
data1 = rand( ) % 100;
data2 = rand( ) % 100;
while(oper == 3 && data2 == 0) //当运算为除法且除数为0时,重新获取除数以免0溢出
data2 = rand( ) % 100;
//将操作数1保存到字符串中
while(data1 > 0) {
data[++i] = data1 % 10;
data1 /= 10;
}
while(i > -1) str[j++] = data[i--] + '0';
str[i++] = ' '; //操作符前后都插入一个空格
switch(oper) {//将操作符保存到字符串中
case 0: str[i++] = '+'; break;
case 1: str[i++] = '-'; break;
case 2: str[i++] = '*'; break;
case 3: str[i++] = '/'; break;
}
str[i++] = ' ';
//将操作数2保存到字符串中
while(data2 > 0) {
data[++i] = data2 % 10;
data2 /= 10;
}
while(i > -1) str[j++] = data[i--] + '0';
str[j] = '\0'; //插入字符串结束符,使其为字符串
return str;
}
int GetAnswer(char *str){ //根据用字符串str表示的算术表达式,计算其结果
int data1 = 0, data2 = 0;
int i = 0;
char oper;
while(str[i] >= '0' && str[i] <= '9') //取操作数1
data1 = data1 * 10 + str[i++] - '0';
oper = str[++i];
i += 2; //跳过中间的空格
while(str[i] >= '0' && str[i] <= '9') //取操作数2
data2 = data2 * 10 + str[i++] - '0';
switch(oper) {
case '+': return data1 + data2;
case '-': retrun data1 - data2;
case '*': return data1 * data2;
case '/': return data1 / data2;
}
}
void main( ) {
int answer;
char str[10];
printf("请按任意键开始答题(e键停止答题)!");
while(getch( ) != 'e') {
strcpy(str, GetRandomExpression( ));
printf("\n%s = ", str);
scanf("%d", &answer);
if(answer != GetAnswer(str))
printf("\n糟糕,你的答案错了,不要灰心!");
else
printf("\n很好,你的答案完全正确,再接再厉!");
printf("\n请按任意键继续答题(e键停止答题)!");
}
}
#include <stdio.h>
#include "Windows.h"
#include "time.h"
int s=-200;
float f=-200.0;
void GetRandomExpression()
{
srand(time(0));
int a=rand()%(100-1);
int b=rand()%(100-1);
int c=rand()%(4-1);
a+=1;
b+=1;
c+=1;
if(c==1)
{
printf("%d+%d=",a,b);
s=a+b;
}
if(c==2)
{
printf("%dx%d=",a,b);
s=a*b;
}
if(c==3)
{
printf("%d÷%d=",a,b);
f=float(a)/float(b);
}
if(c==4)
{
printf("%d-%d=",a,b);
s=a-b;
}
}
int main(void)
{
GetRandomExpression();
float m;
scanf("%f",&m);
if((int)m==s||m==f)
printf("\n你答对了\n");
else
printf("\n你答错了\n");
return 0;
}
30分钟彻底学会C语言指针
钦居倍他: 指针是C语言中广泛使用的一种数据类型. 运用指针编程是C语言最主要的风格之一.利用指针变量可以表示各种数据结构; 能很方便地使用数组和字符串; 并能象汇编语言一样处理内存地址,从而编出精练而高效的程序.指针极大地丰富了C...
碌曲县14743592878: C语言的指针问题 - ?
钦居倍他: 指针,说白了就是储存数据内存段的地址.打个比方说,你家的门牌号是306,那么你家中回来一些客人,这些客人就相当是一些变量,而门牌号就说明了地址,如果张三在你家,另一个人要找到他,那么此时我们只需要告诉那人306,就相当...
碌曲县14743592878: c语言指针问题 - ?
钦居倍他: 其实这个很好理解的,不要太深究了*P就是一个指针(指向一个内存地址),用指针的时候就是把某个数放到指针的地址中 方法:1. int *p=&a或int *p;p=&a;还可int *p=5;.....当你定义了某一个指针指向某一个数时,在用到的这个数时就直接用指针即*p;例如:int *p=a,c;//求3+5=?和输出5;a=5;c=*p+3;注意输出5时不时输出*p,printf("%d",*p);这是错的*p仅仅只是内存内的一个地址而已是没有数的,假如你这样输出输出的仅仅是这个数在内存内的地址而已.真确的输出printf("%d",a);2.当你调用函数时如果子函数要用到指针形参也是*p哦
碌曲县14743592878: C语言中关于指针的指针问题? - ?
钦居倍他: 指针变量存的是地址,地址中的内容是数据 二维指针变量存的也是地址,只是址中的内容还是地址 如:int i ; int *p; int **pp; i=0; //i变量中存的是数据10,i是个变量名 p=&i; //p变量中存的是i的地址 *p==i==5 pp=&p ; //pp中存的是p变量的地址 *pp==p==&i **pp==i==5
碌曲县14743592878: c语言中的指针问题?
钦居倍他: 第一个.*p=*&a;个人认为这种写法不对.至少在C语言中是不对的. 第二个.p=&a;将a的内存地址存放于指针p中. 第三个.*p=&a;将a的内存地址存放与指针p所指向的变量中.
碌曲县14743592878: 请教C语言关于指针的问题 - ?
钦居倍他: (1)int *p,*q; q=p; // 未经赋值的指针变量不能使用 int a,*p,*q; p=q=&a; // 这个应该是正确的(2)int a,*p,*q; q=&a; p=*q; // p=*q;明显错误 int a=20,*p; *p=a; //*p=a错误,可以改成p=&a就对了,*p是指针变量p所指向的变量,连地址都没有 ,...
碌曲县14743592878: C语言指针的问题 - ?
钦居倍他: int *temp; 定义为一个指针,要为其赋一个地址,它才有存值的空间,不然里面是个随机地址,会出错.*temp=*p1; 是把 p1所指向的地址里的值赋值给 temp所指向的地址里,但 temp并没有为其指定一个地址.所以运行后会出错.
碌曲县14743592878: c语言中的指针问题 - ?
钦居倍他: 下面给你个例子 #include <stdio.h> void main() { int *p; int a[4]= {1,2,3,4}; p = a; }在上面的环境下,p是指向数组a[0]的,p++后p就指向a[1],(*p)++其实是值1,同时p指向a[1]
碌曲县14743592878: C语言中关于指针问题 - ?
钦居倍他: 我刚刚在VS2010里试了一下, B和C都是错的.计算机题目应该都是单选的, 所以有可能是你有一点的笔误, B如果是(*w+1)[4]就正确了.首先我给你一个最简单的我自己总结的方法吧, 要想从数组或者指针中取数据的话, 要满足这个公式(...
碌曲县14743592878: C语言指针问题 - ?
钦居倍他: 是没有问题的 执行fun(p,0,3);后,把a[0]到a[3]这里面的几个数据的顺序倒过来 结果是 43215...