指针学习2

1、指向指针的指针(二级指针):指向一级指针(值一定是一级指针的地址);
例:int num = 10;
int *p = # //一级指针:值是变量的地址
int **pf = &p; //二级指针:值是一级指针的地址
int ***q = &pf; //三级指针:值是二级指针的地址
printf(“*p = %d, **pf = %d, ***q = %d”,,*p,**pf,***q);
解几级指针,就咬用到几个*;
2、指针变量占用的内存大小:在32位系统上,指针变量都是占用4字节,在64位系 统上都是占用8字节(即指针占用内存大小不分类型,不分级别)
3、指针和数组:
1)数组空间是连续的,存储相同类型的值;
2)数组名是数组首元素地址,即指向数组首元素的指针;
3)数组名是指针常量,值不能改变,只能指向数组首元素(数组值可变)
4、如何使用指针访问数组:
1)数组名做加减操作(避免数组越界),加——后移,减——前移
2)int num = (&a[2]) - (&a[0]); //2 数组指针做减法计算的是偏移量,指针变量则是计算相差的地址
3)array[1] = *(array + 1) ; //取array[1]地址然后解引
array + 1 = &array[1];
**5、指针数组:数组中所有元素都是指针,本质上是数组;
例:int p[5]; // 数组中存储的都是 int ; p实际上是二级指针
6、数组指针:指针指向一个数组,本质上是指针 int (p)[];*
7、指针作为参数传递:传地址(双向传递)
8、括号运算符:
int c; c = (5,6); //有括号取后面的值
// 函数void dele(char *s)的功能是删除字符串s中 的所有数字字符和非字母字符,并将字符串压缩。 例如原字符串为:abc12ef5ghij8#%%yz,处理后的 字符串为:abcefghijyz。

*#include <stdio.h>
*#include<string.h>**
void dele(char *ch);
int main(int argc, const char * argv[] )
{
    char ch[80];
    printf("请输入字符串:");
    scanf("%s",ch);
    dele(ch);
    return 0;
}
void dele(char *ch)
{
    int i = 0;
    int len = (int)strlen(ch);

    for(i = 0;i < len; i++)
    {
        if ((ch[i] >= 'A' && ch[i] <= 'Z')||(ch[i] >= 'a' && ch[i] <= 'z'))
        {
        }
        else
        {
            for(int j = i; j < len; j++)
                ch[j]  = ch[j + 1];
             i--;   //若第i个不是字母,将第i个字符删除;然后重新判断i是不是字母
            len--;  //删除第i个后,长度也减1
        }
           }
       printf("压缩后的字符串为%s\n",ch);
}

“`删除非字母字符

1、内存分配方式:
1)静态内存分配:编译时由系统完成的,预先分配
2)动态内存分配:运行时完成的,分配与释放空间(何时,大小)都由程序员决定,即时分配
2、5大内存区
栈:编译器自动分配释放,需预先知道分配内存的大小,如局部变量,形参
堆:使用malloc和new动态分配的空间,运行时由程序员手动分配大小和释放空间
例:float pt = (float )malloc(4); //手动分配空间
if(pt == NULL)
{
printf(“空间开辟失败!”);
}
*pt = 100.0;

free(pt); //使用完手动释放空间
pt = NULL; //释放的是堆空间,pt变成了野指针,所以要置空
注意: void *malloc(size_t size) //malloc和free必须成对出现,若malloc次数多于free:内存泄漏,否则会导致二次删除,破坏内存
size_t:实际上是unsign long类型
size:指开辟空间的大小,单位:byte
malloc开辟的空间没有名称,开辟成功返回一个指针,指向开辟空间,若失败则返回NULL,因此在使用malloc时需要判断是否分配成功

常量区:存放常量,不允许修改值,如常量字符串,由编译器完成开辟和释放
全局/静态存储区:储存全局变量(由编译器开辟内存,程序结束后释放)和静态变量
代码区:存放函数体的二进制代码

**3、常量指针与指针常量:主要出现在字符串中
常量指针(字符串)(const char *pt/ char const *pt):指针指向的变量值是一个常量,指向的地址可变,但指针指向变量的值不可变(const在*前面)pt = &a; pt = &a1;
指针常量(数组)(char * const pt):指针指向变量的值是可变,但指针指向的地址不可变(*在const前面)pt = 6; *pt = 10;*
4、引用类型(C++):为变量取一个别名,必须在声明时初始化。
例:int i = 5;
int &j = i; // j 是 i 的别名(小名),共享一块空间,一变全变
常量引用:const int &j = i; 常量引用(j)不能修改引用的值,但引用指向的变量(i)值自身可以做修改
5、变量的作用域:文件域(整个文件)、函数域(函数内部)、语句块域
6、局部变量与全局变量:当在块内部出现与外部变量同名的变量时,外部变量被临时隐藏,若想访问被隐藏的全局变量,要使用全局域操作符::
例:int a = 100;
void func()
{
int a = 8;
printf(“a = %d “ ,a); //a = 8
printf(“a = %d “ ,::a); //a = 100
}
左:表达式左边不能有任何运算符 ;
7、链接:把多个文件合并成单一的可执行文件,
extern:引用另一个源文件的函数或变量
8、静态局部变量:局部变量声明时加上static关键字
特点:1)函数结束后,静态局部变量的内存空间不会被回收
2)多次调用,静态函数不会被重新初始化,每次会使用上次保留值(变量只会被初始化一次)
3)静态局部变量的作用域和普通变量的作用域一样,只能在定义该变量的函数中使用
4)存储在静态变量存储区,整个程序结束后释放
5)与普通变量相比,作用域不变,但生命周期延长(整个程序运行期间)
9、静态全局变量:作用域被缩小,仅在当前目标文件中可使用(不能通过extern来引用),生命周期不变

这里写图片描述
10、参数传递:
值传递:形参是实参的一份拷贝,单向传递,不会影响实参
指针传递:通过形参间接改变实参所指向的值(形参和实参指向同一个内存空间)
引用传递:形参就是实参,改变形参就是改变实参(形参上实参的别名)
11、返回值:
int&/* func() //不能返回一个指向局部变量的引用或指针
int func() //函数传值返回时,编译器会创建一个临时变量来接收返回值
**12、函数指针:一个指针指向一个函数
声明方法:返回值类型 (*指针变量名) ([形参列表]) // int (*func)(int x,int y);
指针函数:一个函数的返回值是一个指针 //int* func(int x);**
13、void*指针:空指针类型
void * :空指针,使用时需要对返回值做类型转换
空指针类型可以转型为其他指针类型,但其他类型指针不能转换成空指针类型
不能对空指针类型进行解引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值