目錄
數(shù)組名的理解:
一維數(shù)組:
?解析:
?字符數(shù)組:
?解析:?
?解析:
字符串數(shù)組:
?解析:?
?解析:?
一級指針:?
?解析:?
?解析:?
二維數(shù)組:
?解析:?
指針筆試題:
題一:一維數(shù)組
題二: 結(jié)構(gòu)體指針
題三: 一維數(shù)組
題四: 二維數(shù)組
題五: 二維數(shù)組
題六: 二維數(shù)組
題七:指針數(shù)組
題八: 指針數(shù)組(多級)
以上就是個人學習見解和學習的解析,歡迎各位大佬在評論區(qū)探討!
感謝大佬們的一鍵三連!?感謝大佬們的一鍵三連!?感謝大佬們的一鍵三連!
數(shù)組名的理解:
數(shù)組名是數(shù)組首元素的地址;
但是有2個例外:
1. sizeof(數(shù)組名),這里的數(shù)組名表示整個數(shù)組,計算的是整個數(shù)組的大小,單位是字節(jié);
2. &數(shù)組名,這里的數(shù)組名表示整個數(shù)組,取出的是整個數(shù)組的地址。
代碼中的4/8指的是在32位或者X86環(huán)境下位4個字節(jié),在X64環(huán)境下是8個字節(jié)。?
一維數(shù)組:
#include <stdio.h>
int main()
{
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));//16
printf("%d\n", sizeof(a + 0));//4/8
printf("%d\n", sizeof(*a));//4
printf("%d\n", sizeof(a + 1));//4/8
printf("%d\n", sizeof(a[1]));//4
printf("%d\n", sizeof(&a));//4/8
printf("%d\n", sizeof(*&a));//16
printf("%d\n", sizeof(&a + 1));//4/8
printf("%d\n", sizeof(&a[0]));//4/8
printf("%d\n", sizeof(&a[0] + 1));//4/8
return 0;
}
?解析:
1、sizeof(數(shù)組名),數(shù)組名表示整個數(shù)組,計算的是整個數(shù)組的大小,單位是字節(jié)。
2、a不是單獨放在sizeof()內(nèi)部,也沒有取地址,所以a就是首元素的地址,a+0還是首元素的地址,是地址大小就是4/8個字節(jié)。
3、*a中的a是數(shù)組首元素的地址,*a就是對首元素的地址解引用,找到的就是首元素,首元素的大小就是4個字節(jié)。
4、這里的a是數(shù)組首元素的地址,a+1是第二個元素的地址,sizeof(a+1)就是地址的大小
5、計算的是第二個元素的大小。
6、&a取出的數(shù)組的地址,數(shù)組的地址也就是個地址。
7、&a---->?int( * )[ 4 ],? ?*&a----->int [ 4 ]。
8、&a取出的是數(shù)組的地址,&a--> int( * )[ 4 ],&a+1是從數(shù)組a的地址向后跳過一個(4個整型元素)數(shù)組的大小,&a+1還是地址,是地址就是4/8個字節(jié)。
9、&a[ 0 ]就是第一個元素的地址,計算的是地址的大小,是地址就是4/8個字節(jié)。
10、&a[ 0 ]+1就是第二個元素的地址,大小是4/8個字節(jié),&a[ 0 ]+1---> &a[ 1 ] 。
?字符數(shù)組:
#include <stdio.h>
int main()
{
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));//6
printf("%d\n", sizeof(arr+0));//4/8
printf("%d\n", sizeof(*arr));//1
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4/8
printf("%d\n", sizeof(&arr+1));//4/8
printf("%d\n", sizeof(&arr[0]+1));//4/8
return 0;
}
?解析:?
1、//數(shù)組名單獨放在sizeof內(nèi)部,這里的arr表示整個數(shù)組,計算的是整個數(shù)組的大小,單位是字節(jié),總共6個字節(jié)類型是char [6]。
2、//arr表示數(shù)組首元素的地址,arr+0還是數(shù)組首元素的地址,是地址就是4/8個字節(jié),類型是char*。
3、//arr表示數(shù)組首元素的地址,*arr就是首元素,大小1個字節(jié),類型是char。
4、//arr[1]就是第二個元素,大小是1個字節(jié)。
5、//&arr是數(shù)組的地址,但是數(shù)組的地址也是地址,是地址就是4/8。
6、//&arr + 1是跳過整個數(shù)組后的地址,是地址就是4/8個字節(jié)。
7、//第二個元素的地址,是4/8個字節(jié)。
#include <stdio.h>
int main()
{
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));//隨機值
printf("%d\n", strlen(arr+0));//隨機值
printf("%d\n", strlen(*arr));//錯誤
printf("%d\n", strlen(arr[1]));//錯誤
printf("%d\n", strlen(&arr));//隨機值
printf("%d\n", strlen(&arr+1));//隨機值
printf("%d\n", strlen(&arr[0]+1));//隨機值
return 0;
}
?解析:
1、因為字符數(shù)組arr中沒有‘ \0 ’,所以在求字符串長度的時候,會一直往后找,產(chǎn)生的結(jié)構(gòu)就是隨機值。
2、arr + 0是首元素的地址,和第一個一樣,也是隨機值。
3、//錯誤, arr是數(shù)組首元素的地址,*arr就是數(shù)組首元素,就是'a'-97;
//strlen函數(shù)參數(shù)的部分需要傳一個地址,當我們傳遞的是'a'時,'a'的ASCII碼值是97,那就是將97作為地址傳參。
//strlen就會從97這個地址開始統(tǒng)計字符串長度,這就非法訪問內(nèi)存了。4、//錯誤
5、//&arr是數(shù)組的地址,數(shù)組的地址和數(shù)組首元素的地址,值是一樣的,那么傳遞給strlen函數(shù)后,依然是從數(shù)組的第一個元素的位置開始往后統(tǒng)計。
6、//隨機值
7、//&arr[0] + 1是第二個元素的地址。結(jié)果也是隨機值。
字符串數(shù)組:
#include <stdio.h>
int main()
{
char arr[] = "abcdef";// a b c d e f \0
printf("%d\n", sizeof(arr));//7
printf("%d\n", sizeof(arr+0));//4
printf("%d\n", sizeof(*arr));//1
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4/8
printf("%d\n", sizeof(&arr+1));//4/8
printf("%d\n", sizeof(&arr[0]+1));//4/8
return 0;
}
?解析:?
1、//7,類型是char [7]。
2、//arr + 0是首元素的地址。
3、//*arr其實就是首元素,1個字節(jié),理解為*arr--> *(arr+0) -- arr[0]。
4、//arr[1]是第二個元素,1個字節(jié)。
5、//&arr是數(shù)組的地址,是地址就是4/8個字節(jié)。
6、//&arr + 1是跳過一個數(shù)組的地址,4/8。
7、//&arr[0] + 1是第二個元素的地址 4/8。
#include <stdio.h>
int main()
{
char arr[] = "abcdef";
printf("%d\n", strlen(arr));//6
printf("%d\n", strlen(arr+0));//6
printf("%d\n", strlen(*arr));//錯誤
printf("%d\n", strlen(arr[1]));//錯誤
printf("%d\n", strlen(&arr));//6
printf("%d\n", strlen(&arr+1));//隨機值
printf("%d\n", strlen(&arr[0]+1));//5
return 0;
}
?解析:?
由于與上面內(nèi)容相同,就不做過多解釋
1、//6
2、//6
3、//err
4、//err
5、//6
6、//隨機值
7、//5
一級指針:?
#include <stdio.h>
int main()
{
char *p = "abcdef";
printf("%d\n", sizeof(p));//4/8
printf("%d\n", sizeof(p+1));//4/8
printf("%d\n", sizeof(*p));//1
printf("%d\n", sizeof(p[0]));//1
printf("%d\n", sizeof(&p));//4/8
printf("%d\n", sizeof(&p+1));//4/8
printf("%d\n", sizeof(&p[0]+1));//4/8
return 0;
}
?解析:?
1、//p是一個指針變量,大小就是4/8。
2、//p+1是'b'的地址,是地址大小就是4/8個字節(jié)。
3、//*p 就是'a'元素,就是1個字節(jié)。
4、//p[0]--> *(p+0) --> *p ?1個字節(jié)。
5、//4/8,類型是&p -- char**。
6、//4/8
7、//4/8 , &p[0] + 1得到是'b'的地址 。
#include <stido.h>
int main()
{
char *p = "abcdef";
printf("%d\n", strlen(p));//6
printf("%d\n", strlen(p+1));//5
printf("%d\n", strlen(*p));//錯誤
printf("%d\n", strlen(p[0]));//錯誤
printf("%d\n", strlen(&p));//隨機值
printf("%d\n", strlen(&p+1));//隨機值
printf("%d\n", strlen(&p[0]+1));//5
return 0;
}
?解析:?
由于與上面內(nèi)容相同,就不做過多解釋
1、//6
2、//5
3、//err
4、//err
5、//隨機值
6、//隨機值
7、//5
二維數(shù)組:
#include <stdio.h>
int main()
{
int a[3][4] = {0};
printf("%d\n",sizeof(a));//48
printf("%d\n",sizeof(a[0][0]));//4
printf("%d\n",sizeof(a[0]));//16
printf("%d\n",sizeof(a[0]+1));//4/8
printf("%d\n",sizeof(*(a[0]+1)));//4
printf("%d\n",sizeof(a+1));//4/8
printf("%d\n",sizeof(*(a+1)));//16
printf("%d\n",sizeof(&a[0]+1));//4/8
printf("%d\n",sizeof(*(&a[0]+1)));//16
printf("%d\n",sizeof(*a));//16
printf("%d\n",sizeof(a[3]));//16
return 0;
}
?解析:?
1、//3*4*4 = 48
2、//4
3、//a[0]是第一行這個一維數(shù)組的數(shù)組名,數(shù)組名算是單獨放在sizeof內(nèi)部了,計算的是整個數(shù)組的大小,大小是16個字節(jié)。
4、//a[0]作為第一行的數(shù)組名,沒有單獨放在sizeo內(nèi)部,沒有&,a[0]表示數(shù)組首元素的地址,也就是a[0][0]的地址,所以a[0]+1是第一行第二個元素的地址,是地址就是4/8個字節(jié)。
5、//4,計算的是就是第一行第2個元素的大小。
6、//4 / 8,a是數(shù)組首元素的地址,是第一行的地址 int(*)[4],a+1 就是第二行的地址。
7、//16,*(a+1) --> a[1] -> sizeof(*(a+1))->sizeof(a[1]) 計算的是第二行的大小,a+1 --> 是第二行的地址,int(*)[4],*(a+1) 訪問的第二行的數(shù)組。
8、//4/8,&a[0]是第一行的地址 int(*)[4],&a[0]+1 是第二行的地址 int(*)[4]。
9、//16 計算的是第二行的大小。
10、//計算的是第一行的大小-16,a是數(shù)組首元素的地址,就是第一行的地址,*a 就是第一行,*a --> *(a+0) --> a[0]。
11、//16,類型是a[3]--> int [4]。
指針筆試題:
題一:一維數(shù)組
#include <stdio.h>
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int *)(&a + 1);
printf( "%d,%d", *(a + 1), *(ptr - 1));
return 0;
}
注意:&a+1的類型為int( * )[ 5 ],強制轉(zhuǎn)換為int( * ).此時每次移動的就是4個字節(jié),而不是20個字節(jié)了!
題二: 結(jié)構(gòu)體指針
#include <stdio.h>
//由于還沒學習結(jié)構(gòu)體,這里告知結(jié)構(gòu)體的大小是20個字節(jié)
struct Test
{
int Num;
char *pcName;
short sDate;
char cha[2];
short sBa[4];
}*p;
//假設p 的值為0x100000。 如下表表達式的值分別為多少?
//已知,結(jié)構(gòu)體Test類型的變量大小是20個字節(jié)
int main()
{
printf("%p\n", p + 0x1);
printf("%p\n", (unsigned long)p + 0x1);
printf("%p\n", (unsigned int*)p + 0x1);
return 0;
}
注意:整型就是正常的加減運算,指針類型就需要加減n*類型的大小。?
題三: 一維數(shù)組
#include <stdio.h>
int main()
{
int a[4] = { 1, 2, 3, 4 };
int *ptr1 = (int *)(&a + 1);
int *ptr2 = (int *)((int)a + 1);
printf( "%x,%x", ptr1[-1], *ptr2);
return 0;
}
注意: a強制轉(zhuǎn)換成int類型+1就是正常加減,最后轉(zhuǎn)換為指針int計算機會向后查找四個字節(jié)。
題四: 二維數(shù)組
#include <stdio.h>
int main()
{
int a[3][2] = { (0, 1), (2, 3), (4, 5) };
int *p;
p = a[0];
printf( "%d", p[0]);
return 0;
}
注意: 注意二維數(shù)組中沒有用{ }把數(shù)值包含,這里用的是( )是逗號表達式,取最后一個值為元素;a[ 0 ]可以看做&a[ 0 ][ 0 ].
題五: 二維數(shù)組
#include <stdio.h>
int main()
{
int a[5][5];
int(*p)[4];
p = a;
printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
return 0;
}
注意:地址相減為相差的元素個數(shù)?,此題為-4,因為求的是地址,所以需要將-4轉(zhuǎn)換成補碼輸出。
題六: 二維數(shù)組
#include <stdio.h>
int main()
{
int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *ptr1 = (int *)(&aa + 1);
int *ptr2 = (int *)(*(aa + 1));
printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));
return 0;
}
注意:*(aa+1) = a[1] = &a[1][0]。
題七:指針數(shù)組
#include <stdio.h>
int main()
{
char *a[] = {"work","at","alibaba"};
char**pa = a;
pa++;
printf("%s\n", *pa);
return 0;
}
注意:這里的a是指針數(shù)組,數(shù)組中每個位置的類型為char*。
題八: 指針數(shù)組(多級)
#include <stdio.h>
int main()
{
char *c[] = {"ENTER","NEW","POINT","FIRST"};
char**cp[] = {c+3,c+2,c+1,c};
char***cpp = cp;
printf("%s\n", **++cpp);
printf("%s\n", *--*++cpp+3);
printf("%s\n", *cpp[-2]+3);
printf("%s\n", cpp[-1][-1]+1);
return 0;
}
注意:有了上面的基礎,這道題一步一步來,你們也可以解釋清楚!??!
文章來源:http://www.zghlxwxcb.cn/news/detail-675501.html
以上就是個人學習見解和學習的解析,歡迎各位大佬在評論區(qū)探討!
感謝大佬們的一鍵三連!?感謝大佬們的一鍵三連!?感謝大佬們的一鍵三連!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??文章來源地址http://www.zghlxwxcb.cn/news/detail-675501.html
到了這里,關(guān)于C語言:指針和數(shù)組(看完拿捏指針和數(shù)組)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!