//一个8位的空间,如果表示无符号数0-255 unsigned char 0~2^8 -1
//如果用来表示有符号数 -128~127 char -2^7 ~2^7-1
//对其范围的探求,不止于,自字节数
#if 0
1字节 char
0 - 255 unsigned char 0~2^8 - 1
-128~127 char -2^7 ~2^7-1
2字节 short
0 -65535 0 ~2^16 -1
-32768 -32767 -2^15~ 2^15-1
4个字节 int
#endif
输入输出
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a = 1;
printf("%2d\n", 123456);//当实际宽度大于域宽时,按实际输出
printf("%2d\n", a);
printf("%10d\n", 10);
printf("%-10d###\n", 10); //左对齐
printf("%15d\n", 123456); //默认空格
printf("%015d\n", 123456); //0 右对齐时用0补齐 默认空格
}
/*
123456
1
10
10 ###
123456
000000000123456
*/
数组
//相同的数据类型构造,就构成了数组
//不同的数据类型,就构成了结构体
//对于构造类型来说,
//定义 大小 初始化 访问
//未初始化
//满初始化
//部分初始化,其余部分清零;初始化清零
//越界初始化 禁止 c语言对于越界是不检的 灵活
凡是构造类型,在定义的时候初始化,不可以先定义再初始化的方式赋值
凡是基本数据类型,既可以在定义时初始化,也可以先定义,再赋值
int main(int argc, char* argv[]) {
int arr[10] = { 1,2,3,4,5,6,7,8,9,10};
for (int i = 0; i < 10; i++) {
printf("arr[%d] = %d\n",i,arr[i]);
}
printf("sizeof(arr)=%d\n", sizeof(arr));
printf("sizeof(arr[0])=%d", sizeof(arr[0]));
}
int main(int argc, char* argv[]) {
int arr[10] = {0};
for (int i = 0; i < 10; i++) {
arr[i] = rand() % 50; //[0,50)
}
for (int i = 0; i < 10;i++) {
printf("arr[%d] = %d\n",i,arr[i]);
}
}
一维数组的存储
一维数组,在内存中是一段连续的存储区域
#include <stdio.h>
int main(int argc, char* argv[]) {
int arr[10];
for (int i = 0; i < 10; i++) {
printf("&arr[%d]= %p\n",i,&arr[i]);
}
}
/*
&arr[0]= 000000231DF2FCC8
&arr[1]= 000000231DF2FCCC
&arr[2]= 000000231DF2FCD0
&arr[3]= 000000231DF2FCD4
&arr[4]= 000000231DF2FCD8
&arr[5]= 000000231DF2FCDC
&arr[6]= 000000231DF2FCE0
&arr[7]= 000000231DF2FCE4
&arr[8]= 000000231DF2FCE8
&arr[9]= 000000231DF2FCEC
*/
数组的三要素
数组的声明,已经把数组访问不的三要素,均已表示出来了,三要素就是,起始位置、移步刻度、终止位置。
#include <stdio.h>
int main(int argc, char* argv[]) {
int maxValue;
int minValue;
int arr[10] = {100,2,7,4,5,6,7,8,9,10};
maxValue = arr[0];
minValue = arr[0];
for (int i = 0; i < 10; i++) {
if (maxValue < arr[i]) {
maxValue = arr[i];
}
if (minValue > arr[i]) {
minValue = arr[i];
}
}
printf("int arr max = %d;min = %d", maxValue, minValue);
return 0;
}
#include <stdio.h>
int main(void)
{
// int arr[] = { 1,2,3,4,56 };
// int[4] arr[3];
// int arr[3][4]; // int[4] arr[3];T arr[3]
int arr[][3] = { 1,2,4,5,6,7,9,10,11,12 };
for (int i = 0; i < sizeof(arr) / sizeof(int[3]); i++) {
for (int j = 0; j < 3; j++) {
printf("%3d", arr[i][j]);
}
putchar(10);
}
printf("sizeof(arr)=%d\n",sizeof(arr));
return 0;
}
三要素
#include <stdio.h>
int main(void)
{
int arr[4];
printf("%p\n", arr); //起始地址
printf("&arr[0] = %p\n", &arr[0]);
printf("arr = %p arr + 1 = %p\n",arr,arr + 1); //步长
return 0;
}
#include <stdio.h>
int main()
{
int arr[3][4]; //int[4] arr[3] T arr[3]
printf("arr = %p \n", arr); //起始地址
printf("&arr[0] = %p\n", &arr[0]);
printf("arr = %p arr + 1 = %p\n", arr, arr + 1); //步长 16 一个一维数组的大小
printf("arr[0] = %p\n",arr[0]); //内嵌一维数组的起始地址
printf("&arr[0][0] =%p \n",& arr[0][0]); //内嵌一维数组首元素的地址
printf("arr[0] + 1 = %p\n",arr[0] + 1);//内嵌一维数组的步长 4
printf("sizeof(arr[0]) = %d sizeof(int[4])= %d\n",sizeof(arr[0]), sizeof(int[4])); //16
printf("sizeof(arr) = %d\n", sizeof(arr)); //48
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
arr[i][j] = rand() % 100;
}
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%3d", arr[i][j]);
}
putchar(10);
}
return 0;
}
/*
arr = 000000869E33FBB8
&arr[0] = 000000869E33FBB8
arr = 000000869E33FBB8 arr + 1 = 000000869E33FBC8
arr[0] = 000000869E33FBB8
&arr[0][0] =000000869E33FBB8
arr[0] + 1 = 000000869E33FBBC
sizeof(arr[0]) = 16 sizeof(int[4])= 16
sizeof(arr) = 48
41 67 34 0
69 24 78 58
62 64 5 45
*/
//一维数组的数组名,是一级指针
//二维数组的数组名是,数组指针
arr = &arr[0]
*arr = arr[0]
#include <stdio.h>
int main()
{
int arr[3][4];
printf("arr = %p\n", arr);
printf("&arr[0] = %p\n", &arr[0]);
printf("arr+1 = %p\n", arr + 1);
// & reference * dereferrence
printf("arr[0] = %p\n",arr[0]);
printf("&arr[0][0] = %p\n", &arr[0][0]);
printf("arr[0] + 1 = %p\n", arr[0] + 1);
printf("arr = %p\n", arr );
printf("arr + 1= %p\n", arr + 1);
//arr = &arr[0]
printf("*arr = %p\n", *arr);//arr[0]
printf("*arr + 1 = %p\n", *arr + 1);
return 0;
}
/*
arr = 000000B6EE10FC28
&arr[0] = 000000B6EE10FC28
arr+1 = 000000B6EE10FC38
arr[0] = 000000B6EE10FC28
&arr[0][0] = 000000B6EE10FC28
arr[0] + 1 = 000000B6EE10FC2C
arr = 000000B6EE10FC28
arr + 1= 000000B6EE10FC38
*arr = 000000B6EE10FC28
*arr + 1 = 000000B6EE10FC2C
*/
二维数组的数组名是,数组指针
#include <stdio.h>
int main()
{
int arr[3][4] = { {2,2,2,0} ,{1,2,0,3}, {4,4,4,4} };
printf("arr = %p\n", arr);
printf("&arr[0] = %p\n", &arr[0]);
printf("arr+1 = %p\n", arr + 1);
// & reference * dereferrence
printf("arr[0] = %p\n",arr[0]);
printf("&arr[0][0] = %p\n", &arr[0][0]);
printf("arr[0] + 1 = %p\n", arr[0] + 1);
printf("arr = %p\n", arr );
printf("arr + 1= %p\n", arr + 1);
//arr = &arr[0]
printf("*arr = %p\n", *arr);//arr[0]
printf("*arr + 1 = %p\n", *arr + 1);
//想访问第2行的第二个元素 arr+1 => a[1] *(arr + 1) = &a[1]
//(*(arr + 1) + 1) => &a[1][1]
printf("a[1][1] = %d\n", *(*(arr + 1) + 1));
//&arr[0] + 1 = &a[1] =
//想访问第2行的第二个元素 arr+1 => &a[1] *(arr + 1) = &a[1]
//(*(arr + 1) + 1) => &a[1][1]
return 0;
}
/*
arr = 000000CC63CFF518
&arr[0] = 000000CC63CFF518
arr+1 = 000000CC63CFF528
arr[0] = 000000CC63CFF518
&arr[0][0] = 000000CC63CFF518
arr[0] + 1 = 000000CC63CFF51C
arr = 000000CC63CFF518
arr + 1= 000000CC63CFF528
*arr = 000000CC63CFF518
*arr + 1 = 000000CC63CFF51C
a[1][1] = 2
*/
int main() {
char *p, q;//声明了一个指针变量,一个int类型的变量
printf("sizeof(p) = %d sizeof(q) = %d\n",sizeof(p),sizeof (q));
}
指针的运算
#include <stdio.h>
//指针 类型(步长) 地址(物理数据)
int main() {
int data = 0x12345678;
char *pc = &data;
printf("%x\n", *pc);
int *p = (int *) 0x0001;
int pData = 0x0001;
printf("p = %#x p+1 = %#x\n", p, p + 1);
printf("pData = %#x pData+1 = %#x\n", pData, pData + 1);
printf("(double*)p = %#x (double*)p+1 = %#x\n", (double*)p, (double*)p + 1);
printf("(int)pData = %#x (int)pData+1 = %#x\n", (int)pData, (int)pData + 1);
printf("%x\n",++p);
printf("%x\n",++pData);
int arr[10];
int pHead = (int)&arr[0];int pTail = (int)&arr[9];
printf("%d\n",pHead - pTail); //-36
// int arr[10];
// int *pHead = &arr[0];int *pTail = &arr[9];
// printf("%d\n",pHead - pTail); //-9
}
/*
pData = 0x1 pData+1 = 0x2
(double*)p = 0x1 (double*)p+1 = 0x9
(int)pData = 0x1 (int)pData+1 = 0x2
5
2
-36
*/
判断是否是回文数
int main() { char name[5] = {'m', 'a', 'd', 'a', 'm'}; char *ph = &name[0]; char *pt = &name[4]; int flag = 1; while(ph < pt){ if (*ph == *pt ){ ph ++; pt --; } else{ break; flag = 0; } } if (flag == 1){ printf("yes"); } else{ printf("非回文"); } return 0; }
#include <stdio.h>
int main() {
//数组访问 偏移法
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// for (int i = 0; i < 10; i++) {
// printf("%d\n", *(arr + i)); // arr = &arr[0] *arr = arr[0]
// }
//数组名是指针常量,方可唯一的表示一个数组。数组名是数组的唯一标识符。
printf("arr = %p\n", arr);
printf("arr + 1 = %p\n", arr + 1);
printf("&arr[0] = %p\n", &arr[0]);
printf("&arr[0]+1=%p", &arr[0] + 1);
//&arr[0] ==arr 在一定程度上。 int *
//一维数组名,可以赋给一级指针
int *pa = &arr[0];
int *pb = arr;
//数组名能干的指针就能干,数组名不能干的 指针也能干
return 0;
}
/*
arr = 00000073a7dff970
arr + 1 = 00000073a7dff974
&arr[0] = 00000073a7dff970
&arr[0]+1=00000073a7dff974
*/
#include <stdio.h>
int main() {
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int *pa = arr;
for (int i = 0; i < 10; i++) {
printf("%d\n", *(pa + i));
}
for (int i = 0; i < 10; i++) {
printf("%d\n", pa[i]);
}
for (int i = 0; i <10 ; ++i) {
printf("%d\n",*pa++);
}
return 0;
}
int *pa = arr; for (int i = 0; i < 10; ++i) { printf("%d\n", *(pa++)); }
小结:
- 数组名是一个常量,不允许重新赋值
- 指针变量是一个变量,可以重新赋值
- p+i和a+i均表示数组元素a[i]的地址,均指向a[i]
- //*(p+i)和 *(a+i)均表示p+i和a+i所指向的内容a[i]
- *p++ = *(p++) 先得到 *p 再使 p=p+1
- (*p)++表示将p所指向的元素的值加一,等价于a[i]++
- 指向数组元素的指针也可以表示成数组的形式,即允许指针变量带下标,*(p+i) 也可以表示成p[i]
二维数组的访问方式
下标法
数组元素的表示方法是:数组名[行] [列]
本质偏移法
a a[0] a[0] [0]
int a[3] [4]; a = &a[0]
*a = a[0]
&a[0] = a
a[i] <==> *(a+i)
a[i] [j] <==>* (*(a+i)+j)
a是数组首元素的地址,所以a的值和&a[0]的值相同,另一方面,a[0]本身是包含4个整数的数组,因此,a[0]的值同其首元素的地址&a[0] [0]相同。简单的讲,a[0]是一个整数大小对象的地址,而a是4个整数大小对象的地址。因为整数和4个整数组成的数组开始于同一个地址,因此a和a[0]的值是相同的。
a 所指的对象大小是4个int,而a[0]所指的对象大小一个int 所以a+1 和 a[0] + 1
推论(仅助理解)
二维数组名解引用,降维为一维数组名 *(a+1) a[1]
一维数组名,对其引用,升级为二维数组名 &a[1] <>(a+1)
&引用和*解引用互为逆向关系
#include <stdio.h>
int main() {
int arr[3][4] = {1, 2, 3, 4,
10, 20, 30, 40,
100, 200, 300, 400};
for (int i = 2; i >= 0; i--) {
for (int j = 3; j >= 0; j--) {
printf("arr[%d][%d] = %#x\n", i, j, &arr[i][j]);
}
printf("=======\n");
}
// arr[2][1] ==> *(*(arr + 2)+1)
printf("%d\n", *(*(arr + 2) + 1));
printf("arr = %#p arr+1 = %#x arr+2 = %#x \n", arr, arr + 1, arr + 2);
printf("arr[0] = %#p arr[0]+1 = %#x arr[0]+2 = %#x \n", arr[0], arr[0] + 1, arr[0] + 2);
printf("*arr = %#p *arr+1 = %#x *arr+2 = %#x \n", *arr, *arr + 1, *arr + 2);
printf("&arr[0] = %#p &arr[0]+1 = %#x &arr[0]+2 = %#x \n", &arr[0], &arr[0] + 1, &arr[0] + 2);
printf("arr[0][0] = %d arr[0][1] = %d arr[0][2] = %d \n", *arr[0], *(arr[0] + 1), *(arr[0] + 2));
printf("arr[0][0] = %d arr[0][1] = %d arr[0][2] = %d \n", **arr, *(*arr + 1), *(*arr + 2));
//arr arr[0]
// *arr --> arr[0]
//arr[0] arr
// &arr[0] --> arr
return 0;
}
/*
arr[2][3] = 0x1e9ffa1c
arr[2][2] = 0x1e9ffa18
arr[2][1] = 0x1e9ffa14
arr[2][0] = 0x1e9ffa10
=======
arr[1][3] = 0x1e9ffa0c
arr[1][2] = 0x1e9ffa08
arr[1][1] = 0x1e9ffa04
arr[1][0] = 0x1e9ffa00
=======
arr[0][3] = 0x1e9ff9fc
arr[0][2] = 0x1e9ff9f8
arr[0][1] = 0x1e9ff9f4
arr[0][0] = 0x1e9ff9f0
=======
200
arr = 0x481e9ff9f0 arr+1 = 0x1e9ffa00 arr+2 = 0x1e9ffa10
arr[0] = 0x481e9ff9f0 arr[0]+1 = 0x1e9ff9f4 arr[0]+2 = 0x1e9ff9f8
*arr = 0x481e9ff9f0 *arr+1 = 0x1e9ff9f4 *arr+2 = 0x1e9ff9f8
&arr[0] = 0x481e9ff9f0 &arr[0]+1 = 0x1e9ffa00 &arr[0]+2 = 0x1e9ffa10
arr[0][0] = 1 arr[0][1] = 2 arr[0][2] = 3
arr[0][0] = 1 arr[0][1] = 2 arr[0][2] = 3
Process finished with exit code 0
*/
二维数组的本质是,数组指针 二维数组名 跟二级指针没有毛关系
#include <stdio.h>
int main()
{
char* p = "abcdef";//"abcdef"是一个常量字符串
//*p = 'W'; 错误的 segmentation fault 段错误
printf("%s\n",p);
printf("%c\n", *p);
printf("%s\n",p); //%s 指针p 会打印整个字符串
return 0;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "acbdef";
char* p1 = "abcdef";
char* p2 = "abcdef";
if (arr1 == arr2)
{
printf("hehe\n");
}
else
{
printf("haha\n");
}
}
//输出haha
int main()
{
char arr1[] = "abcdef";
char arr2[] = "acbdef";
char* p1 = "abcdef";
char* p2 = "acbdef";
if (p1 == p2)
{
printf("hehe\n");
}
else
{
printf("haha\n");
}
}
//输出hehe
指针数组 是数组 用来存放指针的
int main()
{
int arr[10] = { 0 };//整型数组
char ch[5] = { 0 };//字符数组
int* parr[4];//存放整型指针的数组 -指针数组
char* pch[5];//存放字符指针的数组 -指针数组
return 0;
}
int main()
{
int a = 10;
int b = 20;
int c = 30;
int d = 40;
int* arr[4] = { &a,&b,&c,&d };
int i = 0;
for (i = 0; i < 4; i++)
{
printf("%d ",*(arr[i]));
}
return 0;
}
//输出 10 20 30 40
指针加一并不是单纯的加一,而是指向下一个元素的地址,看指针的类型,例如int 则是郏4个字节
int main()
{
int arr1[] = {1,2,3,4,5};
int arr2[] = {2,3,4,5,6};
int arr3[] = {3,4,5,6,7};
int* parr[] = {arr1, arr2,arr3};
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%d ", * (parr[i] + j));
}
printf("\n");
}
return 0;
}
数组指针
//数组指针 - 指针
int main()
{
//int* p = NULL;//整型指针 -指向整型的指针 - 可以存放整型的地址
//char* pc = NULL;//pc是字符指针 -指向字符的指针 - 可以存放字符的地址
//数组指针 - 指向数组的指针 - 可以存放数组的地址
//int arr[10] = { 0 };
// arr - 首元素地址
//&arr[0]- 首元素地址
//&arr - 数组的地址
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int (*p)[] = &arr;//数组的地址要存起来
printf("%d", (*p)[0]); //(*p) 相当于 arr
}
int main()
{
char* arr[5];
char* (*pa)[5] = &arr;
return 0;
}
数组指针的使用
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int (*pa)[10] = &arr;
for (int i = 0; i < 10; i++)
{
//printf("%d ",(* pa)[i]);
printf("%d ", *(*pa + i));// *pa数组首元素的地址 + i 第i个元素的地址 然后解引用
}
return 0;
}
//参数是数组的方式
void print1(int arr[3][5],int x,int y)
{
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 5; j++)
{
//printf("%d ", (*(arr))[i] + j);
printf("%d ", arr[i][j]); //理解成二维数组中 一维数组的 数组名
}
printf("\n");
}
}
//参数是指针的形式
void print2(int (*p)[5],int x,int y)
{
for (int i = 0; i < x; i++)
{
for (int j = 0; j < y; j++)
{
//printf("%d ", *(*(p + i) + j));
printf("%d ", (*(p + i))[j]);
}
printf("\n");
}
}
int main()
{
int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
print1(arr,3,5);//arr - 数组名 - 首元素地址 看成一维数组 就是{1,2,3,4,5}这个数组的地址
print2(arr, 3, 5);
return 0;
}
/*
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
*/
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int i = 0; int* p = arr; for (int i = 0; i < 10; i++) { printf("%d ", p[i]); //printf("%d ", *(p + i)); //printf("%d ", *(arr + i)); //printf("%d ", arr[i]); //arr[i] == *(arr+i) == *(p+i) ==p[i] } return 0;
**arr[i] == (arr+i) == (p+i) ==p[i]
改写
void print2(int (*p)[5],int x,int y)
{
for (int i = 0; i < x; i++)
{
for (int j = 0; j < y; j++)
{
//printf("%d ", *(*(p + i) + j));
//printf("%d ",*(p[i]+j))
printf("%d ", p[i][j]);
//printf("%d ", (*(p + i))[j]);
}
printf("\n");
}
}
int main()
{
int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
print2(arr, 3, 5);
return 0;
}
指针Pointer
认识内存
线性内存
内存的最小单位b 内存的最小编址单元B,内存中每个字节都对应一个地址,通过地址才能找到每个字节。
#include <stdio.h>
int main(int argc, char* argv[]) {
int arr[3][4] = { 1,2,3 };
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++) {
printf("%p\n",&arr[i][j]);
}
putchar(10); //输出一个ascii码值是10的字符 即回车换行
}
return 0;
}
/*
00000050F78FF7F8
00000050F78FF7FC
00000050F78FF800
00000050F78FF804
00000050F78FF808
00000050F78FF80C
00000050F78FF810
00000050F78FF814
00000050F78FF818
00000050F78FF81C
00000050F78FF820
00000050F78FF824*/
#include <stdio.h>
int main(int argc, char* argv[]) {
//除了char占一个字节,占一个地址
// 其他类型包含多个字节,也就是拥有多个地址。
//当我们变量取地址的时候 拿到的是哪个字节的地址? 低字节的地址
char a; short b; int c; double d;
printf("%p\n", &a); printf("%#x\n", &a);
printf("%p\n", &b); printf("%#x\n", &b);
printf("%p\n", &c); printf("%#x\n", &c);
printf("%p\n", &d); printf("%#x\n", &d);
printf("sizeof(a) = %d\n",sizeof(&a));
printf("sizeof(b) = %d\n", sizeof(&b));
printf("sizeof(c) = %d\n", sizeof(&c));
printf("sizeof(d) = %d\n", sizeof(&d));
return 0;
}
/*
000000A16E14F5D4
0x6e14f5d4
000000A16E14F5F4
0x6e14f5f4
000000A16E14F614
0x6e14f614
000000A16E14F638
0x6e14f638
sizeof(a) = 8
sizeof(b) = 8
sizeof(c) = 8
sizeof(d) = 8*/
指针常量
指针常量 ->指针变量
对变量取地址,取出的地址,就是一个指针,且常量指针
& * reference derefer 取地址 取内容
常量指针不是一个单纯的地址,而是有类型的
指针的本质,是一个有类型的地址,类型决定了,从这个地址开始的寻址能力。
#include <stdio.h>
int main(int argc, char* argv[]) {
//指针常量 ->指针变量
//对变量取地址,取出的地址,就是一个指针,且常量指针
//& * reference derefer 取地址 取内容
char a = 1; short b = 2; int c = 10; double d = 123.45;
printf("%p ", &a); printf("%#x\n", &a);
printf("%p ", &b); printf("%#x\n", &b);
printf("%p ", &c); printf("%#x\n", &c);
printf("%p ", &d); printf("%#x\n", &d);
printf("%d\n",*(&a));
printf("%d\n",*(&b));
printf("%d\n",*(&c));
printf("%f\n",*(&d));
printf("%d\n", *((char*) 0x8a53fca4));
printf("%d\n", *((short*) 0x8a53fcc4));
printf("%d\n", *((int*) 0x8a53fce4));
printf("%f\n", *((double*) 0x8a53fd08));
return 0;
}
&a | 0x8a53fca4 | (char*) 0x8a53fca4 |
---|---|---|
&b | 0x8a53fcc4 | (short*) 0x8a53fcc4 |
&c | 0x8a53fce4 | (int*) 0x8a53fce4 |
&d | 0x8a53fd08 | (double *)0x8a53fd08 |
小端序
12 |
---|
34 |
56 |
78 |
#include <stdio.h>
int main(int argc, char* argv[]) {
int data = 0x12345678;
printf("%p\n",&data);
printf("%#x\n",*(&data));
//printf("%x\n",*((char*) 0000009CB7D2F574))
printf("%x\n",*((char*)&data)); //对变量取地址 不仅取出了地址 还有类型
printf("%x\n", *((short*)&data));
printf("%x\n", *((int*)&data));
return 0;
}
/*
0000009CB7D2F574
0x12345678
78
5678
12345678
指针的本质,是一个有类型的地址,类型决定了,从这个地址开始的寻址能力。
*/
指针变量
64位系统,这个位数指的是CPU 里面的通用寄存器的数据宽度为64位,也就是说一个地址占二进制位数是64,所以:sizeof(double *)sizeof(int *)sizeof(char *)64/88。
32位系统,同理,他的一个地址占32位二进制空间,sizeof(double *)sizeof(int *)sizeof(char *)32/84。
type * pointerName; *表明了本变量是指针变量,大小 此处的*仅能用于表示声明,类型决定了该指针变量中存储的地址的寻址能力。
#include <stdio.h>
//声明一个指针变量,必须要保存两种东西 一个地址数据 一个类型
//type * pointerName; *表明了本变量是指针变量,大小
int main(int argc, char* argv[]) {
//int a = 12;
//char c = 'c';
//float d = 1.2f;
char a; short b; int c; float f; double d;
printf("%d\n",(sizeof(char *)));
printf("%d\n", (sizeof(short *)));
printf("%d\n", (sizeof(int *)));
printf("%d\n", (sizeof(double *)));
char* pa = &a;
short* pb = &b;
int* pc = &c;
float* pf = &f;
double* pd = &d;
printf("%f\n", *pd);//printf("%f\n", *(&d));
return 0;
}
/*
8
8
8
8
5.600000
*/
int main() {
int data = 0x12345678;
int* pd = &data;
printf("%x\n", *pd);
printf("%x\n", *((int*)pd));
printf("%x\n", *((short*)pd));
printf("%x\n", *((char*)pd));
return 0;
}
/*
12345678
12345678
5678
78
*/
#include <stdio.h>
int main(int argc, char* argv[]) {
int arr[10];
for (int i = 0; i < 10; i++) {
printf("&arr[%d]= %p\n",i,&arr[i]);
arr[i] = i;
}
for (int i = 0; i < 10;i++) {
printf("%d\n", arr[i]);
printf("%d\n", *(arr + i));
}
//代表构造类型/参与元素的访问,此时代表首元素的地址
//arr 首元素地址
printf("&arr[0] = %p\n", &arr[0]);
printf("arr = %p\n", arr);
printf("arr = %p\n", arr);
printf("%d %d\n",arr[1],1[arr]); //[]下标运算符 基址变址运算符
}
/*
&arr[8]= 0000009B60AFF808
&arr[9]= 0000009B60AFF80C
0
0
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
&arr[0] = 0000009B60AFF7E8
arr = 0000009B60AFF7E8
arr = 0000009B60AFF7E8
1 1
*/
标签:10,arr,int,char,数组,printf,sizeof,遇上,指针
From: https://www.cnblogs.com/hekang520/p/17169456.html