2021-7-20
看不懂
#include<stdio.h> int main() {int a[5] = { 1,2,3,4,5 };int* p = (int*)(&a + 1);printf("%d", *(p - 1));return 0; } mov ebx,10h;---直接訪問 mov [ebx],10h;---間接訪問數據存放在內存中,,內存中字節的編號稱為地址(指針),
地址從0開始,依次增加,對于32位環境,程序能夠使用的最大內存為4GB
最小:0x00000000 最大:0XFFFFFFFF
地址無大小,只有高低
1個存儲單元 = 1字節 = 8位二進制
1個字 = 2個字節
int c = a*b;//乘號 int *p;//聲明指針,定義一個指針變量 *p = 100;//解引用,獲取指針指向的數據在指針定義中,*號是和變量名相結合的
int* p = &a;//把a的地址給p 7/2=3 //整型 7.0/2.0 = 3.5 //浮點型強轉只是轉值,不轉類型
野指針 int * p;//不給初始化,取的值可能是隨機值
int *p = null; int * p = &a; int main() {int a = 10,b = 20;int * ip = null;ip = &a;*ip = 100;ip = &b;*ip = 200;return 0; } &ip;//ip的物理地址 ip=&a;//ip存放的是a的地址 *ip=*&a=a;編譯器能夠識別的四種類型?
1.整型
int a = 10;//十進制常量 int b = 010;//八進制常量 int c = 0x10;//十六進制常量 int d = 0b1010;//二進制常量double
float ft = 12.25f;字符串
const char * sp = "yhping";字符常量
內存中的數據以二進制存放,以十六進制觀察
0x1000 001c---同樣為1,權重不一樣 a 97 61 低地址作為首地址對于32位系統,地址大小為32個二進制位,4個字節,指針大小為4字節
對于64位系統,指針大小為8字節
void fun() {int a = 200;*p = 100;p = &a; } int main() {int x = 0;int *s = &a;fun(s);printf("%d %d\n",x,*s);return 0; } int main() {int a = 0,b = 20;int *s = &a;int *p = s;*p = 100;p = &b;*p = 200; } int *p = ar;//int *p = &ar[0]; for(int i = 0;i<n;++i) {printf("0x%08x=%d\n",p,*p);p = p + 1;//0x00fbfd20 + sizeof(int)*1;//0x00fbfd24 }指針的不同,加1的能力也不同
typename * p;
p = p + 1;
被編譯器解釋為:
p = p + sizeof(typename)*1;
數組名在表達式中被自動轉換為一個指向數組第一個元素的指針常量
數組的下標為什么從0開始而非從1開始?
對數組的訪問有兩種格式:
1.從邏輯上講:下標和指針
int main() {const int n = 5;int ar[n] = {12,23,34,45,56};for(int i = 0;i<n;++i){ar[i] = *(ar+i);} }2.從物理上講,指針 *(ar+i)
int main() {const int n = 5;int ar[n] = {12,23,34,45,56};int *p = ar;for(int i= 0;i<n;++i){printf("%d %d %d\n",p[i],*(p + i),i[p],*(i+p));}return 0; }為什么c語言在編譯的過程中把下標轉換為指針?
尋址方案,基變址尋址
*(p+i) p:基地址 i:變址CPU中最珍貴的資源是時間資源和空間資源
void Print_Array(int br[5],int n)//數組:有多少個元素,要開辟多少個空間,這樣會降低效率 {int ar_len = sizeof(br);printf("ar_len:%d\n",ar_len); } int main() {const int n = 5;int ar[n] = {1,2,3,4,5};Print_Array(ar,n);return 0; }//使程序盡量運行速度快,空間內存小 //void Print_Ar(int br) //void Print_Ar(int br[10])//均會退化成指針形式 void Print_Ar(int *br) {int size = sizeof(br);printf("size:%d\n",size); } int main() {int br[10];int br;//errorconst int n = 10;int ar[n] = {12,23,34,45,56,67,78,89,90,100};sizeof(ar);//數組名Print_Ar(ar);//數組首元素地址return 0; } void Print_Ar(int *br,int n) {for(int i = 0;i<b;++i){printf("%d",br[i]);printf("%d",*(br+i));} }以上面實例相比,退化為指針,只需要傳遞4個字節即可,不用管數組的大小,只傳遞數組首地址
原因:根本在于節省空間,以小的代價換取大的利益
int main() {const int n = 100;int ar[i] = {};for(int i = 0;i<n;++i){ar[i] = rand()%100+1;//1...100}for(int i = 0;i<n;++i){printf("%4d",ar[i]);if((i+1)%10==0){printf("\n");}}return 0; } void Print_Ar(int *br,int n) {for(int i= 0;i<n;++i){printf("%4d",ar[i]);if((i+1)%10==0){printf("\n");}} } void Init_Ar(int *br,int n) {assert(br != nullptr);for(int i = 0;i<n;++i){ar[i] = rand()%100+1;//1...100} } void swap_Int(int *ap,int *bp) {asssert(ap!=nullptr&&bp!=nullptr);int tmp = *ap;*ap = *bp;*bp = tmp; } void bubbleSort(int *br,int n) {assert(br!=nullptr);for(i = 1;i<n;++i){for(j = 0;j<n-i;++j){if(br[j]>br[j+1]){swap_Int(br[j],br[j+1]);}}} }1.判斷當前的系統是大端存放還是小端存放?
小端模式:高位存放在高地址,低位存放在低地址
大端模式:高位存放在低地址,低位存放在高地址
#include <stdio.h> union test//共用體 {int a;char b; }; int main(void) {union test t1;t1.a = 1;if (t1.b == 1){printf("小端模式\n");}else{printf("大端模式\n");}return 0; }冒泡排序
#include<stdio.h> #include<stdlib.h> #include<time.h> void BUbble_Sort(int *ar,int n) {int tmp = 0;for (int i = 1; i < n; i++) {for (int j = 0; j <=n - i-1; j++) {if (ar[j]>ar[j + 1]) {tmp = ar[j + 1];ar[j + 1] = ar[j];ar[j] = tmp;} } } } void Print_Ar(int *ar,int n) {for (int i = 0; i < n; i++) {printf("%d ",*(ar + i));if ((i + 1) % 10 == 0) {printf("\n");}} } void Init_Ar() {const int n = 100;int ar[n];srand(time(NULL));for (int i = 0; i < n; i++) {ar[i] = rand() % 100 + 1;}BUbble_Sort(ar, n);Print_Ar(ar,n); } int main() {Init_Ar();return 0; }總結
                            
                        - 上一篇: mnv*框架开发时代
 - 下一篇: CST雷击间接效应仿真