取址运算符 &
scanf(“%d”, &i)里面的 &
获得变量的地址后, 它的操作数必须是变量
int i; printf(“%x”, &i) //16进制输出
地址的大小是否与 int 相同类型 sizeof(int)
取决于编译器
1 2 3 4 printf ("%lu\n" , sizeof (int ));printf ("%lu\n" , sizeof (&i));
变量的值是内存的地址。
普通变量的值是实际的地址。
指针变量的值是具有实际值的变量的地址。
错误写法
指针
它的值是变量的地址.
int *p, q; // 表示p是一个int型指针变量, q是普通int型.
数组变量是特殊的指针
函数参数表中的数组实际上就是指针
所以以下四种函数原型是等价的
int sum(int *arr, int n);
int sum(int *, int);
int sum(int arr[], int n);
int sum(int [], int n);
1 2 3 4 int a[] = {5 , 15 , 34 , 54 , 14 , 2 , 52 , 72 };int *p = &a[1 ];则 p[2 ] 的值是 34 , p[-1 ] 的值是 5
练习
/*
GPS数据处理
题目内容:
NMEA-0183 协议是为了在不同的 GPS(全球定位系统)导航设备中建立统一的BTCM(海事无线电技术委员会)标准,由美国国家海洋电子协会(NMEA-The National Marine Electronics Associa-tion)制定的一套通讯协议。GPS接收机根据NMEA-0183协议的标准规范,将位置、速度等信息通过串口传送到PC机、PDA等设备。
NMEA-0183 协议是 GPS 接收机应当遵守的标准协议,也是目前GPS接收机上使用最广泛的协议,大多数常见的GPS接收机、GPS数据处理软件、导航软件都遵守或者至少兼容这个协议。
NMEA-0183协议定义的语句非常多,但是常用的或者说兼容性最广的语句只有G P G G A 、 GPGGA、 G P G G A 、 GPGSA、G P G S V 、 GPGSV、 G P G S V 、 GPRMC、G P V T G 、 GPVTG、 G P V T G 、 GPGLL等。
其中$GPRMC语句的格式如下: $GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,A*50
这里整条语句是一个文本行,行中以逗号“,”隔开各个字段,每个字段的大小(长度)不一,这里的示例只是一种可能,并不能认为字段的大小就如上述例句一样。
字段0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐最小定位信息
字段1:UTC时间,hhmmss.sss格式
字段2:状态,A=定位,V=未定位
字段3:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
字段4:纬度N(北纬)或S(南纬)
字段5:经度dddmm.mmmm,度分格式(前导位数不足则补0)
字段6:经度E(东经)或W(西经)
字段7:速度,节,Knots
字段8:方位角,度
字段9:UTC日期,DDMMYY格式
字段10:磁偏角,(000 - 180)度(前导位数不足则补0)
字段11:磁偏角方向,E=东W=西
字段16:校验值
这里,“”为校验和识别符,其后面的两位数为校验和,代表了“$”和“ ”之间所有字符(不包括这两个字符)的异或值的十六进制值。上面这条例句的校验和是十六进制的50,也就是十进制的80。
提示:^ 运算符的作用是异或。将 $和之间所有的字符做^运算(第一个字符和第二个字符异或,结果再和第三个字符异或,依此类推)之后的值对65536取余后的结果,应该和 后面的两个十六进制数字的值相等,否则的话说明这条语句在传输中发生了错误。注意这个十六进制值中是会出现A-F的大写字母的。
现在,你的程序要读入一系列 GPS 输出,其中包含 $GPRMC,也包含其他语句。在数据的最后,有一行单独的
END
表示数据的结束。
你的程序要从中找出 G P R M C 语句,计算校验和,找出其中校验正确,并且字段 2 表示已定位的语句,从中计算出时间,换算成北京时间。一次数据中会包含多条 GPRMC 语句,计算校验和,找出其中校验正确,并且字段2表示已定位的语句,从中计算出时间,换算成北京时间。一次数据中会包含多条 G P R M C 语 句 , 计 算 校 验 和 , 找 出 其 中 校 验 正 确 , 并 且 字 段 2 表 示 已 定 位 的 语 句 , 从 中 计 算 出 时 间 , 换 算 成 北 京 时 间 。 一 次 数 据 中 会 包 含 多 条 GPRMC语句,以最后一条语句得到的北京时间作为结果输出。
你的程序一定会读到一条有效的 $GPRMC 语句。
输入格式:
多条 GPS 语句,每条均以回车换行结束。最后一行是END三个大写字母。
输出格式:
6位数时间,表达为:
hh:mm:ss
其中,hh是两位数的小时,不足两位时前面补0;mm是两位数的分钟,不足两位时前面补0;ss是两位数的秒,不足两位时前面补0。
输入样例:
$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,A*50
END
输出样例:
10:48:13
*/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 #include <stdio.h> #include <string.h> int char2Int (char c) { int ret; if (c >= '0' && c <= '9' ) { ret = c - '0' + 0 ; } else if (c >= 'A' && c <= 'F' ) { ret = c - 'A' + 10 ; } else if (c >= 'a' && c <= 'f' ) { ret = c - 'a' + 10 ; } return ret; } int trans2Integer (char c1, char c2) { int i = 10 * char2Int(c1) + char2Int(c2); return i; } int trans2IntegerPlus8 (char c1, char c2) { int i = trans2Integer(c1, c2); if (i <= 15 ) { i += 8 ; } else { i -= 16 ; } return i; } int trans2IntegerHex (char c1, char c2) { int i = 16 * char2Int(c1) + char2Int(c2); return i; } void printNum (int i) { char ret[2 ]; if (i<10 ) { ret[0 ] = '0' ; } else { ret[0 ] = i / 10 + '0' + 0 ; } ret[1 ] = i % 10 + '0' + 0 ; printf ("%s" , ret); } int main () { char str[88 ]; char strFinal[88 ] = "" ; char *strEnd = "END" ; int condition = 0 ; do { scanf ("%88s" , str); if (strcmp (str, strEnd) != 0 ) { if (str[0 ] == '$' && str[1 ] == 'G' && str[2 ] == 'P' && str[3 ] == 'R' && str[4 ] == 'M' && str[5 ] == 'C' ) { int len = strlen (str); int checkRet = 'G' ; char wantA; char wantB; for (int i = 2 ; i<len; i ++) { if (str[i] != '*' ) { checkRet ^= str[i]; } else { wantA = str[i + 1 ]; wantB = str[i + 2 ]; break ; } } checkRet %= 65536 ; if (checkRet == trans2IntegerHex(wantA, wantB)) { condition = 1 ; strcpy (strFinal, str); } } } else { break ; } } while (1 ); if (condition) { char hour1 = strFinal[7 ]; char hour2 = strFinal[8 ]; printNum(trans2IntegerPlus8(hour1, hour2)); printf (":" ); char min1 = strFinal[9 ]; char min2 = strFinal[10 ]; printNum(trans2Integer(min1, min2)); printf (":" ); char second1 = strFinal[11 ]; char sencod2 = strFinal[12 ]; printNum(trans2Integer(second1, sencod2)); } return 0 ; }