<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">一、数据的存储</span>
字节是最小的存储单元,一个字节称为一个存储单元(内存单元), 不同数据类型所占用的存储单元不等。为了正确访问内存单元,每个内存单元都有一个编号。
内存单元的编号称作地址。内存单元中的内容才是我们关注的数据。
二、访问方式
数据访问一般分为直接访问和间接访问。
直接访问:直接访问内存单元中的内容。例如: a = 20; b = 2 * a等
间接访问:通过内存单元编号以及数据所占字节数访问内存中数据。
间接访问在程序中随处可见,指针是间接访问的常用⽅式。
三指针变量
定义:存放内存地址的变量
int * p = NULL; 初始值:NULL恒等于0,即为空。
变量类型:整型指针
注意:指针变量所占字节数只与操作系统有关。
如何打印指针变量的值?
printf("p = %p\n", p); 用转义字符%p;
**********************
取址运算符:
int a = 3;
int *p = &a;
printf("&a = %p\n", &a);
printf("p = %p\n", p);
取值运算符:
int a = 3, b = 5;
int *p = &a; printf("%d\n", *p);
p = &b;
*p = 100; printf("%d\n", b);
*和&是配套的操作符。
*******************************
指针的算数运算
只有加、减运算:
注意:指针类型决定移动几个字节
int * p = &a;
p++; //向⾼位移动四个字节
p--; //向低位移动四个字节
指针变量的赋值意味着重指向。
*******注意事项:
指针变量定义时
*只起修饰作用,告诉编译器p是指针。
指针变量取值时*访问内存地址为p的存储区域。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
数组:用连续内存空间存储数据的构造类型。
数组名: 数组元素首地址
例如:int array[3] = {1, 3, 8}; // array 恒等于 &array[0]
指针可以当数组名使⽤
p[1] = 3;
恒等于a[1]
;
恒等于*(p+1) ;
恒等于*(a+1);
数组与指针的不同:
所占空间不同
指针:只与操作系统位数有关 。
数组:与元素个数和类型有关。
数组名是常量地址,不能重指向(不能赋值)指针可以重指向。
**********用指针不能算出数组元素个数。
指针与字符串;
C语言使用字符数组保存字符串。
例如:char string[10] = “iPhone”;
string为数组名,同时也是数组的首地址。
char *p = string;
如何使用p输出字符串。
字符指针可以操作单个字符,也可以操作字符串。
例如:
char string[] = “iPhone”; //string为数组名
char *p = string;
*(p + 1) = ‘v’;
printf(“%s”,p + 1);
//指向字符数组⾸首地址 //操作单个字符//操作整个字符串
。
******可以通过指针计算字符串的长度。
存放指针的数组成为指针数组。
例如:
char *strings[3] = { “iOS”, “Android”, “Win8”};
思考:如何输出全部字符串? 注意:可以用指针修改字符数组,但不可修改常量字符串
总结:
指针变量是存放地址的变量,指针变量的赋值,意味着指针的重指向。
数组名代表数组的首地址,⽽且是常量地址,不可以修改。
函数调⽤时,形参拷贝了实参的值。
(((((((((((((((((((((((((((((((((((((((((((((((
作业:
1.编写一个函数,交换 2 个浮点数。
2. 在主函数中输入6个字符串(二维数组),对他们按从小到大的顺序,然后输出这 6 个已经排好序的字符串。要求使用指针数组进行处理。
3. 面试题: 有一字符串中包含数字与字符,请编程去除数字.
答案:
main文件:
//第一题
//int main(int argc, const char * argv[])
//{
// float a = 1.1,b = 2.2;
// swap1(&a, &b);
// printf("%.2f %.2f",a,b);
// return 0;
//}
第2题
//int main(int argc, const char * argv[])
//{
// //定义六个字符串,即六行的二维字符数组
// char a[6][100]={"chi","hong","huang","lv","lan","dian"};
// //分别找出六个字符串首地址
// char *p[6]={};
// for (int i = 0; i<6; i++) {
// p[i] = a[i];
// }
// //用冒泡排序
// for (int i = 0; i < 6-1; i++) {
// for (int j = 0; j < 6-1-i; j++) {
// if (strcmp(p[j], p[j+1])>0) {
// char *temp = {0};
// temp = p[j];
// p[j] = p[j+1];
// p[j+1] = temp;
// }
// }
// }
// //打印出来排好序的
// for (int i =0; i<6; i++) {
// printf("%s ",p[i]);
// }
//
// return 0;
//}
//第3题
// int main(int argc, const char * argv[])
// {
// char a[ ]= {"kajshfk"};
// for (int i = 0; i < sizeof(a)-1 ; i++) {
// if (a[i]<'0' ||a[i]>'9') {
// printf("%c",a[i]);
// }
// }
// return 0;
// }
.h文件
void swap1 (float *x, float *y);
))))))))))))))))))))))))))))
<span style="font-size:32px;">.m文件</span>
<pre name="code" class="objc"><span style="font-size:18px;">oid swap1 (float *x, float *y)
{
float temp = *x; //传址
*x = *y;
*y = temp;
}</span><span style="font-size:32px;">
</span>