C总结提高篇数据类型(大小,别名,封装)、变量、程序的内存四区模型
原文链接:https://blog.csdn.net/Daycym/article/details/78385028
“类型”是对数据的抽象
类型相同的数据有相同的表示形式、存储格式以及相关的操作
程序中使用的所有数据都必定属于某一种数据类型
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
void main()
{
int a; //告诉c编译器分配4个字节的内存
int b[10] ; //告诉c编译器分配40个自己内存
printf("b:%d, b+1:%d, &b:%d, &b+1:%d \n", b, b+1, &b, &b+1);
printf("sizeof(b):%d \n", sizeof(b)); //40
printf("sizeof(a):%d \n ", sizeof(a)); //4
//sizeof是操作符,不是函数;sizeof测量的实体大小为编译期间就已确定
// b+1 &b+1 结果不一样 //b &b所代表的数据类型不一样
//b 代表的数组首元素的地址
//&b代表的是整个数组的地址
printf("hello....\n");
system("pause");
}
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
char * getStr1()
{
char *p1 = "abcdefg";
//char *p1 = "abcdefg2";
return p1;
}
char *getStr2()
{
char *p2 = "abcdefg2";
return p2;
}
void main()
{
char *p1 = NULL;
char *p2 = NULL;
p1 = getStr1();
p2 = getStr2();
//打印p1 p2 所指向内存空间的数据
printf("p1:%s , p2:%s \n", p1, p2);
//打印p1 p2 的值
printf("p1:%d , p2:%d \n", p1, p2);
printf("hello...\n");
system("pause");
return ;
}
把char *p1 = “abcdefg”;改为char *p1 = “abcdefg2”;发现指针所指地址一样。
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
//堆
char *getMem(int num)
{
char *p1 = NULL;
p1 = (char *)malloc(sizeof(char) * num);
if (p1 == NULL)
{
return NULL;
}
return p1;
}
//栈
//注意 return不是把内存块 64个字节,给return出来,而是把内存块的首地址(内存的标号0xaa11) ,返回给 tmp
// 理解指针的关键,是内存. 没有内存哪里的指针
//
char *getMem2()
{
char buf[64]; //临时变量 栈区存放
strcpy(buf, "123456789");
//printf("buf:%s\n", buf);
return buf;
}
void main()
{
char *tmp = NULL;
tmp = getMem(10);
if (tmp == NULL)
{
return ;
}
strcpy(tmp, "111222"); //向tmp做指向的内存空间中copy数据
//tmp = getMem2();
tmp = 0xaa11;
printf("hello..tmp:%s.\n", tmp);
system("pause");
return ;
}
1) 指针也是一种变量,占有内存空间,用来保存内存地址
2)*p操作内存
在指针声明时,*号表示所声明的变量为指针
在指针使用时,号表示 操作 指针所指向的内存空间中的值
p相当于通过地址(p变量的值)找到一块内存;然后操作内存
p放在等号的左边赋值(给内存赋值)
p放在等号的右边取值(从内存获取值)
3)指针变量和它指向的内存块是两个不同的概念
//含义1 给p赋值p=0x1111; 只会改变指针变量值,不会改变所指的内容;p = p +1; //p++
//含义2 给p赋值p=’a’; 不会改变指针变量的值,只会改变所指的内存块的值
//含义3 =左边p 表示 给内存赋值, =右边p 表示取值 含义不同切结!
//含义4 =左边char *p
//含义5 保证所指的内存块能修改
4)指针是一种数据类型,是指它指向的内存空间的数据类型
含义1:指针步长(p++),根据所致内存空间的数据类型来确定
p++=->(unsigned char )p+sizeof(a);
结论:指针的步长,根据所指内存空间类型来定。
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
void main()
{
int a = 10;
char *p1 = 100; //分配4个字节的内存
char ****p2 = 100;
int *p3 = NULL;
p3 = &a;
*p3 = 20; //间接的修改a的值
//*就像一把钥匙 通过一个地址(&a),去修改a变量的标示的内存空间
{
int c = 0;
c = *p3; //c=20
//*p放在=号左边 写内存
//*p放=号的右边 读内存
printf("c:%d \n", c);
}
{
char *p4 = NULL;
p4 = (char *)malloc(100);
p4 = (char *)malloc(200); //0xcc11
}
printf("a:%d , p1:%d , p2: %d", sizeof(a), sizeof(p1), sizeof(p2));
printf("hello...\n");
system("pause");
return ;
}
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
char *getStr()
{
char *tmp = NULL;
tmp = "abcdefgf";
return tmp;
}
void main()
{
char *p = getStr();
printf("p:%s \n", p);
*(p+2) = 'r'; //经常出现的错误 保证指针所指向的内存空间 可以被修改
system("pause");
return ;
}