C8_指针

<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>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值