二维数组数和指针操作的理解
生活随笔
收集整理的這篇文章主要介紹了
二维数组数和指针操作的理解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#include<string.h>
#include <stdio.h>
int main(void)
{int a[4][2] = { { 2,4 },{ 6,8 },{ 1,3 },{ 5,7 } };char *p[5] = { "acvsadf", "cwerqwenn", "tttttt" };//字符串指針數組int c[4] = { 0,1,2,3 };int *ptr = c;/*這個正確,說明a[0]是一個地址,而且只指向一個int類型;也說明它是一維數組(這個數組有兩個元素,即2和4)的首元素(這里是2)的地址;+1會加上4個字節,即一個int類型的大小;*/int *p1 = a[0];//int (*p2)[2] = a[0];//error/*這個正確,說明&a[0]是一個地址,而且指向一個包含兩個int元素的數組;也說明它是數組(這個數組有4個元素,分別{ 2,4 },{ 6,8 },{ 1,3 },{ 5,7 })首元素(這里是{2,4})的地址;+1會加上8個字節,即兩個int類型的大小;*/int(*p3)[2] = &a[0];//[]表示的是該指針指向數組,而數組里面有[?]個元素int(*p4)[2] = a;//這個說明&a[0]和a性質是一樣的。//int (*p5)[8] = &a;//error//int (*p6)[4] = &a;//error//int* p7 = &a;//怎樣指向整個數組?int* p8 = (int*)a;//這樣就達到了對整個數組的訪問,這種訪問方式和訪問一維數組無異。printf("數組名操作:\n");printf("1------------\n");//這些地址是一樣的printf("%p\n", a);printf("%p\n", &a[0]);printf("%p\n", a[0]); printf("%p\n", &a);printf("2------------\n");//a,&a[0]printf("%p\n", a + 1);//a表示數組(退化為1維數組,看做有4個元素)的首元素地址,這里的元素指{2,4},+1會加上8個字節printf("%p\n", &a[0] + 1);//這里&a[0]和a的性質一樣printf("%p\n", &a[1][0]);printf("3------------\n");//a[0]printf("%p\n", a[0] + 1);//這里a[0]表示一維數組(這個數組有兩個元素,即2和4)的首元素的地址,+1會加上4個字節printf("%p\n", &a[0][1]);printf("4------------\n");//&aprintf("%p\n", &a + 1);//這里&a表示整個數組的首地址,+1會加上8*4=32個字節printf("5------------\n");printf("%d\n", a[0]); //a[0]為啥不是a[0][0]的值?因為它僅是指針,是a[0][0]的地址printf("%d\n", *a[0]);//*a[0]表示的是a[0][0]printf("%d\n", **a); //*a表示a[0](因為從前面可知a表示&a[0]),**a表示a[0][0]printf("%d\n", a[0][0]);printf("\n指針操作:\n");printf("%p\n", p1 + 1);//和3一樣printf("%p\n", p3 + 1);//和2一樣printf("%p\n", p4 + 1);//和2一樣//char *p[5] = { "acvsadf", "cwerqwenn", "tttttt" };//字符串指針數組printf("\n字符串指針數組操作:\n");/*首先明確這里的p和&p[0]性質一樣,則*p即為p[0];p+1即為&p[0]+1,也就是&p[1],則*(p+1)即為p[1];&p[0]可以看做是一個指向一個數組的指針,+1要加上整個數組的大小。*/printf("p = %s\n", p); //亂碼printf("*p = %s\n", *p); //"acvsadf"printf("(*p)+1 = %s\n", (*p) + 1);//"cvsadf",*p即為p[0],p[0]是指向char類型的指針,因此+1是移動一個char長度單位printf("p[0]+1 = %s\n", p[0]+1); //"cvsadf",和上面一個應該一樣printf("*(p+1)+1 = %s\n", *(p+1)+1);//“werqwenn”printf("*(p + 1) = %s\n", *(p + 1));//“cwerqwenn”,注意這里是一個指針,因此是%s打印printf("**(p + 1) = %c\n", **(p + 1)); //‘c’,注意這里已經是完全解引用了,因此是%c打印得到一個字符printf("*(p[1] + 1) = %c\n", *(p[1] + 1)); //‘w’printf("*(*(p + 1) + 1) = %c\n", *(*(p + 1) + 1));//'w',注意這里已經是完全解引用了,因此是%c打印得到一個字符/*int c[4] = { 0,1,2,3 };int *ptr = c;*/printf("\n一維數組的操作:\n");printf("1-------------\n");//地址都一樣printf("&c = %p\n", &c); printf("c = %p\n", c);printf("&c[0] = %p\n", &c[0]);printf("2-------------\n");printf("&c = %d\n", &c);printf("c = %d\n", c);printf("&c[0] = %d\n", &c[0]);printf("3-------------\n");printf("&c+1 = %p\n", &c+1);//&c表示整個數組的開始地址,+1的話,會跨越整個數組printf("c+1 = %p\n", c+1);//c和&c[0]性質一樣,都表示首元素的地址printf("&c[0]+1 = %p\n", &c[0]+1);//后兩個應該一樣printf("4-------------\n");printf("*ptr = %d\n", *ptr);//0printf("*(ptr+1) = %d\n", *(ptr+1));//1printf("c[0] = %d\n", c[0]);//0getchar();return 0;}
?
?
?
?
綜上記憶為:統一性,即首字母和“&首元素”意義是一樣的。
?
對于int c[4],c和&c[0]是一樣的;
?
- 解引用后,*c=c[0],表示數組第一個元素的值;
- &c[0]+1和c+1是一樣的,都表示c[1]的地址,即&c[1];
?
對于int a[4][2],a和&a[0]是一樣的;
?
- 解引用后,*a=a[0],a[0]表示指向一維數組的指針,可以有指針的操作a[0]+1(此時的a[0]相當于指針,擯棄以前的慣性思維),即a[0][1]的地址&a[0][1];
- &a[0]+1和a+1是一樣的,都表示a[1]的地址,即&a[1];
- 而a[1]本身就是a[1][0]的地址;
- 因此由a[1][0]=*a[1]=*(a+1)=*(&a[0]+1);
?
對于char* p[5],p和&p[0]是一樣的。
?
- 解引用后,*p=p[0],p[0]表示指向字符串的指針,可以有指針操作p[0]+1,也可以寫成p[0][1],這就和二維數組一致了。
- &p[0]+1和p+1是一樣的,都表示p[1]的地址,即&p[1];
- *(p+1)=*(&p[1])=p[1],而p[1]在此表示一個字符串指針。
總結
以上是生活随笔為你收集整理的二维数组数和指针操作的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win11 dev cpp程序关闭时弹出
- 下一篇: java学生管理系统界面设计